2013-01-10 139 views
0

我有一個BackgroundWorker_workerBackgroundWorker的暫停

void _worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    _timer = new System.Timers.Timer(); 
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
    _timer.Interval = 5000; 
    _timer.Start(); 
} 

當它到達它認爲它已經完成如此打響RunWorkerCompleted event_timer.Start()

我不希望它結束​​,直到_timer.Interval時間已經達到和_timer Elapsed event已觸發:

void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    for (int i = 1; i < 20; i++) 
    { 
     if (listBox1.InvokeRequired) 
      listBox1.Invoke((Action)(() => listBox1.Items.Add("Do Things Thread"))); 
     else 
      listBox1.Items.Add("Do Things Completed"); 

     _worker.ReportProgress((int)(((decimal)i/(decimal)20) * 100)); 

     Thread.Sleep(1000); 
    } 

    _timer.Stop(); 
} 

因爲我需要的BackgroundWorker報到了一些進展。

我該怎麼做。我需要它運行在不同的thread

+1

你知道已經有線程定時器? – Lloyd

+0

我不是......你能指點我到MSDN頁面嗎? –

+0

Yeh sure - http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx – Lloyd

回答

1

因此,圍繞討論和解決方案。

System.Timers.Timer會自動線程計時器事件你,除非你提供一個同步對象,如MSDN討論:

如果物業對於SynchronizingObject爲null,經過的事件 上凸起ThreadPool線程。如果處理Elapsed事件 的持續時間比間隔更長,則可能會在另一個線程池線程上再次引發該事件。在這種情況下,事件處理程序應該是 可重入。

這意味着後臺工作人員變成了超員工。您可以簡單地讓您的計時器事件代碼按原樣運行(因爲它使用調用來無論如何與UI進行交互)。

這意味着如果這些事件需要很長時間才能同時運行。但是,您當然可以在事件回調中停止並啓動計時器。

0

您的_timer_Elapsed事件在不同的線程上。一旦控制流經過_worker_DoWork函數,計時器實例就會過期。您的計時器對象變量的範圍僅限於該函數,因此它不會以這種方式工作。

我建議你把Thread.sleep(5000)放在timer _worker_dowork函數本身中。它不會影響你的應用程序,因爲線程會睡眠並且GUI仍然會響應。

0

我想,只是用我所做的一切玩弄,是我調用的進度條,所以我不需要ReportProgress:

_worker.ReportProgress((int)(((decimal)i/(decimal)20) * 100)); 

更改爲:

if (progressBar1.InvokeRequired) 
    progressBar1.Invoke((Action)(() => progressBar1.Value = (int)(((decimal)i/(decimal)20) * 100))); 
else 
    progressBar1.Value = (int)(((decimal)i/(decimal)20) * 100); 

這意味着,我不必暫停BackgroundWorker,並且定時器在不同的線程上被調用,並且會一直保留,直到丟棄爲止。

+1

你正在混合線程,你的計時器會在某個事件中增加過去的時間,只要執行invoke和don'不要擔心後臺工作人員的問題 – Lloyd

+0

用戶界面的響應能力會受到影響嗎?我認爲我會繼續使用System.Threading.Timers的路由! –

+0

不,它是線程化的。線程 – Lloyd