摘要
在C#中,處理線程等待和延續(xù)的任務(wù)可以通過Task類來實(shí)現(xiàn)。Task類是.NET 中的一部分,提供了一種簡單而強(qiáng)大的方式來處理異步操作。
Wait:針對單個(gè)Task的實(shí)例,可以task1.wait進(jìn)行線程等待
WaitAny:線程列表中任何一個(gè)線程執(zhí)行完畢即可執(zhí)行(阻塞主線程)
WaitAll:線程列表中所有線程執(zhí)行完畢方可執(zhí)行(阻塞主線程)
WhenAny:與ContinueWith配合,線程列表中任何一個(gè)執(zhí)行完畢,則繼續(xù)ContinueWith中的任務(wù)(開啟新線程,不阻塞主線程)
WhenAll:與ContinueWith配合,線程列表中所有線程執(zhí)行完畢,則繼續(xù)ContinueWith中的任務(wù)(開啟新線程,不阻塞主線程)
ContinueWith:與WhenAny或WhenAll配合使用
ContinueWhenAny:等價(jià)于Task的WhenAny+ContinueWith
ContinueWhenAll:等價(jià)于Task的WhenAll+ContinueWith
正文
一個(gè)例子
Action<string, int> log = (name, times) =>
{
this.BeginInvoke(new Action(() =>
{
txtValue.AppendText(name + "開始..."+System.Environment.NewLine);
}));
Thread.Sleep(times);
this.BeginInvoke(new Action(() =>
{
txtValue.AppendText(name + "完成..." + System.Environment.NewLine);
}));
};
List<Task> tasks = new List<Task>()
{
Task.Run(() =>
{
log("劉備",1000);
}),
Task.Run(() =>
{
log("張飛",2000);
}),
Task.Run(() =>
{
log("關(guān)羽",3000);
})
};
//Task.WaitAny(tasks.ToArray());//先開始,再一個(gè)個(gè)完成
//Task.WaitAll(tasks.ToArray());//全部完成
//Task.WhenAny(tasks.ToArray()).ContinueWith(x =>
//{
// this.BeginInvoke(new Action(() =>
// {
// txtValue.AppendText("完成了..." + System.Environment.NewLine);
// }));
//});//當(dāng)一個(gè)完成后
Task.WhenAll(tasks.ToArray()).ContinueWith(x =>
{
this.BeginInvoke(new Action(() =>
{
txtValue.AppendText("都完成了..." + System.Environment.NewLine);
}));
});//當(dāng)全部完成后

C#中處理任務(wù)等待和延續(xù)的不同方式。選擇哪種方法取決于你的具體需求和場景。在實(shí)際開發(fā)中,推薦使用await關(guān)鍵字來實(shí)現(xiàn)異步編程,因?yàn)樗芨玫乇3謶?yīng)用的響應(yīng)性和性能。
該文章在 2024/3/31 1:11:31 編輯過