C# using a timer inside a Backgroundworker

假装没事ソ 提交于 2019-12-22 18:57:20

问题


I couldn't find a solution for this yet...hope someone can help me.

I have a backgroundworker that runs until it is cancelled by the user (it reads data from a socket and writes it into a file).

Now I want to split the output file after a certain period of time, e.g. every 2 mins create a new file.

For this to happen I'd like to use a timer, something like

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

Any suggestions / ideas?

edit: Stopwatch did the trick. Here's my solution Here's my solution:

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();
    }
}

回答1:


Use a Stopwatch and check within the while loop the Elapsed property. That way you prevent from concurrent writing and closing the same file.




回答2:


From a design perspective I would separate the concerns of writing and splitting into files. You may want to look into the source code of log4net (NLog?) since they have implementations of rolling file appenders, since you may have to be careful about not messing up by losing some data.




回答3:


You could use a Threading.Timer like so

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:


Define a global variable which store timer tick count.

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

}


来源:https://stackoverflow.com/questions/7567609/c-sharp-using-a-timer-inside-a-backgroundworker

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!