C # с использованием таймера внутри Backgroundworker - PullRequest
2 голосов
/ 27 сентября 2011

Я пока не могу найти решение для этого ... надеюсь, кто-то может мне помочь.

У меня есть фоновый работник, который работает до тех пор, пока пользователь не отменит его (он читает данные из сокета и записывает их в файл).

Теперь я хочу разделить выходной файл через определенный промежуток времени, например, каждые 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
    }
 ...
}
}

Есть предложения / идеи?

edit: Секундомер сделал свое дело. Вот мое решение Вот мое решение:

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 ]

3 голосов
/ 27 сентября 2011

Используйте Секундомер и проверьте в цикле while свойство Elapsed. Таким образом вы предотвращаете одновременную запись и закрытие одного и того же файла.

1 голос
/ 27 сентября 2011

С точки зрения дизайна я бы разделял задачи написания и разбиения на файлы. Возможно, вам захочется заглянуть в исходный код log4net (NLog?), Поскольку в них есть реализации для добавления файловых апдейтеров, поскольку вам, возможно, следует быть осторожным, чтобы не испортить потерю некоторых данных.

1 голос
/ 27 сентября 2011

Вы можете использовать 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. 
    }
}
0 голосов
/ 27 сентября 2011

Определить глобальную переменную, в которой хранится количество тактов таймера.

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

}
...