C#在后台工作人员中使用计时器

C#在后台工作人员中使用计时器,c#,timer,backgroundworker,C#,Timer,Backgroundworker,我还没找到解决办法…希望有人能帮我 我有一个backgroundworker,它一直运行到用户取消它为止(它从套接字读取数据并将其写入文件) 现在我想在一段时间后分割输出文件,例如每2分钟创建一个新文件 为了实现这一点,我想使用一个计时器,比如 private void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e) { //create timer and set its interval to e.Argument //start

我还没找到解决办法…希望有人能帮我

我有一个backgroundworker,它一直运行到用户取消它为止(它从套接字读取数据并将其写入文件)

现在我想在一段时间后分割输出文件,例如每2分钟创建一个新文件

为了实现这一点,我想使用一个计时器,比如

private void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
//create timer and set its interval to e.Argument
//start timer

while(true)
{
    if(timer.finished == true)
    {
    //close old file and create new
    //restart timer
    }
 ...
}
}
有什么建议/想法吗

编辑:秒表成功了。这是我的解决办法 以下是我的解决方案:

private void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
long targettime = (long) e.Argument;
Stopwatch watch = new Stopwatch();
if (targettime > 0)
            watch.Start();
while(true)
{
    if ((targettime > 0) && (watch.ElapsedMilliseconds >= targettime))
    {
    ...
    watch.Reset();
    watch.Start();
    }
}

定义一个全局变量,用于存储计时器计时计数

 int timerCount = 0;
-

-


你可以用一个线程计时器,就像这样

private static void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
    var timer = new Timer(x => 
    {
       lock (file)
       {
          // close old file and open new file                    
       }
    }, null, 0, (int)e.Argument);

    while(true)
    {
        if (bckWrkSocket.CancellationPending) { e.Cancel = true; return; }
        // check socket etc. 
    }
}

在while循环中使用并检查经过的属性。这样可以防止同时写入和关闭同一个文件。

从设计角度来看,我将把写入和拆分成文件的问题分开。您可能需要查看log4net(NLog?)的源代码,因为它们有滚动文件附加器的实现,因为您可能必须小心不要丢失一些数据而弄乱。非常肯定这会导致bgw在调用
timer.Start()
后很快退出(但我刚刚偶然发现了这个线程,还没有测试)
public void TimerEventProcessor(Object myObject,
                                        EventArgs myEventArgs) {

     if(timerCount % 2 == 0)
         //Do you works

     timerCount++;

}
private static void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
    var timer = new Timer(x => 
    {
       lock (file)
       {
          // close old file and open new file                    
       }
    }, null, 0, (int)e.Argument);

    while(true)
    {
        if (bckWrkSocket.CancellationPending) { e.Cancel = true; return; }
        // check socket etc. 
    }
}