2012-08-28 109 views
1

我想再次運行我的後臺工作是完成時啓動後臺工作一次以上.. 這就像運行或窗體應用程序

backgroundWorker1.do工作 然後 後臺工作完成 然後運行背景worker1.do再工作...... 怎麼辦呢.. 請注意,我不得不一次又一次地運行許多後臺工作.... 謝謝

+2

爲什麼不在1 Bgw內部運行循環? –

+0

您是否嘗試過再次運行該工人?我相信它應該起作用,或者你遇到麻煩了? – waldrumpus

+0

我同意@HenkHolterman使用while(true)並使用CancelAsync()將是一個更好的方法 –

回答

0

也許你可以只創建一個新的BackgroundWorker與相同的屬性,或者你只需​​調用backgroundw orker1.doWork()完成後。

1

你可以在RunWorkerCompleted事件處理程序的調用添加到RunWorkerAsync()

bw.RunWorkerCompleted += bw_RunWorkerCompleted; 

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     ((BackgroundWorker)sender).RunWorkerAsync(); 
    } 
+1

是的,我測試了這個 – paul

0

如果your're使用.NET 4.0或.NET 4.5,你可以使用Tasks,而不是BackgroundWorker的:

// Here your long running operation 
private int LongRunningOperation() 
{ 
    Thread.Sleep(1000); 
    return 42; 
} 

// This operation will be called for processing tasks results 
private void ProcessTaskResults(Task t) 
{ 
    // We'll call this method in UI thread, so Invoke/BeginInvoke 
    // is not required 
    this.textBox.Text = t.Result; 

} 

// Starting long running operation 
private void StartAsyncOperation() 
{ 
    // Starting long running operation using Task.Factory 
    // instead of background worker. 
    var task = Task.Factory.StartNew(LongRunningOperation); 

    // Subscribing to tasks continuation that calls 
    // when our long running operation finished 
    task.ContinueWith(t => 
    { 
     ProcessTaskResults(t); 
     StartOperation(); 
    // Marking to execute this continuation in the UI thread! 
    }, TaskScheduler.FromSynchronizationContext); 
} 

// somewhere inside you form's code, like btn_Click: 
StartAsyncOperation(); 

處理長時間運行的操作時,基於任務的異步是一種更好的方法。

+0

AFAIK默認情況下任務將被創建爲短期任務。你應該使用'Task.Factory.StartNew(LongRunningOperation,TaskCreationOptions.LongRunning)'給'Task'處理代碼提示。 – ony

+0

@ony:實際上,BackgroundWorker類本身使用線程池線程,因此建議使用TaskCreationOptions.LongRunning來中斷代碼行爲。經驗法則是僅當您確定知道此操作長時間運行時才使用LongRunning提示。 –

相關問題