C#在Backgroundworker中使用计时器

时间:2011-09-27 10:23:55

标签: c# timer 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();
    }
}

4 个答案:

答案 0 :(得分:3)

使用Stopwatch并在while循环中检查Elapsed属性。这样就可以防止并发写入和关闭同一个文件。

答案 1 :(得分:1)

您可以像这样使用Threading.Timer

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. 
    }
}

答案 2 :(得分:1)

从设计的角度来看,我会将写作和拆分的问题分开。您可能希望查看log4net(NLog?)的源代码,因为它们具有滚动文件追加器的实现,因为您可能必须小心不要因丢失一些数据而搞乱。

答案 3 :(得分:0)

定义一个存储计时器滴答计数的全局变量。

 int timerCount = 0;

-

private void bckWrkSocket_DoWork(object sender, DoWorkEventArgs e)
{
     timer.Tick += new EventHandler(TimerEventProcessor);

     // Sets the timer interval to 1 minute.
     timer.Interval = 60000;
     timer.Start();
}

-

public void TimerEventProcessor(Object myObject,
                                        EventArgs myEventArgs) {

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

     timerCount++;

}
相关问题