我想再次運行我的後臺工作是完成時啓動後臺工作一次以上.. 這就像運行或窗體應用程序
backgroundWorker1.do工作 然後 後臺工作完成 然後運行背景worker1.do再工作...... 怎麼辦呢.. 請注意,我不得不一次又一次地運行許多後臺工作.... 謝謝
我想再次運行我的後臺工作是完成時啓動後臺工作一次以上.. 這就像運行或窗體應用程序
backgroundWorker1.do工作 然後 後臺工作完成 然後運行背景worker1.do再工作...... 怎麼辦呢.. 請注意,我不得不一次又一次地運行許多後臺工作.... 謝謝
也許你可以只創建一個新的BackgroundWorker與相同的屬性,或者你只需調用backgroundw orker1.doWork()完成後。
你可以在RunWorkerCompleted
事件處理程序的調用添加到RunWorkerAsync()
bw.RunWorkerCompleted += bw_RunWorkerCompleted;
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
((BackgroundWorker)sender).RunWorkerAsync();
}
是的,我測試了這個 – paul
如果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();
處理長時間運行的操作時,基於任務的異步是一種更好的方法。
AFAIK默認情況下任務將被創建爲短期任務。你應該使用'Task.Factory.StartNew(LongRunningOperation,TaskCreationOptions.LongRunning)'給'Task'處理代碼提示。 – ony
@ony:實際上,BackgroundWorker類本身使用線程池線程,因此建議使用TaskCreationOptions.LongRunning來中斷代碼行爲。經驗法則是僅當您確定知道此操作長時間運行時才使用LongRunning提示。 –
爲什麼不在1 Bgw內部運行循環? –
您是否嘗試過再次運行該工人?我相信它應該起作用,或者你遇到麻煩了? – waldrumpus
我同意@HenkHolterman使用while(true)並使用CancelAsync()將是一個更好的方法 –