【问题标题】:C# using a timer inside a BackgroundworkerC# 在 Backgroundworker 中使用计时器
【发布时间】:2011-09-27 10:23:54
【问题描述】:

我还没有找到解决方案...希望有人可以帮助我。

我有一个后台工作程序,它一直运行直到被用户取消(它从套接字读取数据并将其写入文件)。

现在我想在一段时间后拆分输出文件,例如每 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();
    }
}

【问题讨论】:

    标签: c# timer backgroundworker


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      从设计的角度来看,我会将写入和拆分为文件的关注点分开。您可能需要查看 log4net (NLog?) 的源代码,因为它们具有滚动文件附加程序的实现,因为您可能必须小心不要因为丢失一些数据而搞砸。

      【讨论】:

        【解决方案3】:

        你可以像这样使用 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. 
            }
        }
        

        【讨论】:

          【解决方案4】:

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

           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++;
          
          }
          

          【讨论】:

          • 很确定这会导致 bgw 在调用 timer.Start() 后不久退出(但我只是偶然发现了这个线程,尚未测试)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多