使用BackgroundWorker的,你只想把後臺工作納入DoWork
,並更新到RunWorkerCompleted
:
var bw1 = new BackgroundWorker();
var bw2 = new BackgroundWorker();
var bw3 = new BackgroundWorker();
bw1.DoWork += (sender, args) => args.Result = Operation1();
bw2.DoWork += (sender, args) => args.Result = Operation2();
bw3.DoWork += (sender, args) => args.Result = Operation2();
bw1.RunWorkerCompleted += (sender, args) => {
if ((bool)args.Result)
{
richTextBox.AppendText("Operation1 ended\n");
bw2.RunWorkerAsync();
}
};
bw2.RunWorkerCompleted += (sender, args) => {
if ((bool)args.Result)
{
richTextBox.AppendText("Operation2 ended\n");
bw3.RunWorkerAsync();
}
};
bw3.RunWorkerCompleted += (sender, args) => {
if ((bool)args.Result)
{
richTextBox.AppendText("Operation3 ended\n");
}
};
bw1.RunWorkerAsync();
你會發現,這個運行相抵觸的「幹」。你總是可以考慮抽象的任務使用類似的每一步:
var operations = new Func<bool>[] { Operation1, Operation2, Operation3, };
var workers = new BackgroundWorker[operations.Length];
for (int i = 0; i < operations.Length; i++)
{
int locali = i; // avoid modified closure
var bw = new BackgroundWorker();
bw.DoWork += (sender, args) => args.Result = operations[locali]();
bw.RunWorkerCompleted += (sender, args) =>
{
txt.Text = string.Format("Operation{0} ended\n", locali+1);
if (locali < operations.Length - 1)
workers[locali + 1].RunWorkerAsync();
};
workers[locali] = bw;
}
workers[0].RunWorkerAsync();
你可以做的3倍以上,或使用ReportProgress
在一個後臺線程運行的所有任務,並定期報告進展情況。
感謝您的回覆。我收到這個錯誤:'await'操作符只能在異步方法中使用。考慮使用「異步」修飾符標記此方法,並將其返回類型更改爲「任務」。我錯過了什麼? – Erez
@Erez - 根據編譯器錯誤,您需要使用'async'修飾符標記該方法。我已經更新了我的答案,以表明你如何做到這一點。你不需要改變它的返回類型爲任務,雖然 –
謝謝,它的工作。但是,如果操作需要獲取參數呢?嘗試將值傳遞給方法時,我得到「方法名稱預期」。 – Erez