2011-09-27 180 views
2

我找不到解決方案,但希望有人能幫助我。C#在Backgroundworker中使用計時器

我有一個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(); 
    } 
} 

回答

3

使用Stopwatch和while循環經過的內查屬性。這樣你可以防止同時寫入和關閉同一個文件。

+0

Stopwatch發揮了訣竅。謝謝! – metacircle

+0

然後標記爲接受的答案。 – riezebosch

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

} 
+0

很確定這會導致bgw在調用'timer.Start()'後不久退出 – Assimilater

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

從設計的角度來看,我會把寫作和分裂成文件的問題分開。您可能想查看log4net(NLog?)的源代碼,因爲它們具有滾動文件appender的實現,因爲您可能必須小心不要因丟失一些數據而搞亂。