摘要
在C#中,處理線程等待和延續的任務可以通過Task類來實現。Task類是.NET 中的一部分,提供了一種簡單而強大的方式來處理異步操作。
Wait:針對單個Task的實例,可以task1.wait進行線程等待
WaitAny:線程列表中任何一個線程執行完畢即可執行(阻塞主線程)
WaitAll:線程列表中所有線程執行完畢方可執行(阻塞主線程)
WhenAny:與ContinueWith配合,線程列表中任何一個執行完畢,則繼續ContinueWith中的任務(開啟新線程,不阻塞主線程)
WhenAll:與ContinueWith配合,線程列表中所有線程執行完畢,則繼續ContinueWith中的任務(開啟新線程,不阻塞主線程)
ContinueWith:與WhenAny或WhenAll配合使用
ContinueWhenAny:等價于Task的WhenAny+ContinueWith
ContinueWhenAll:等價于Task的WhenAll+ContinueWith
正文
一個例子
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("關羽",3000);
})
};
//Task.WaitAny(tasks.ToArray());//先開始,再一個個完成
//Task.WaitAll(tasks.ToArray());//全部完成
//Task.WhenAny(tasks.ToArray()).ContinueWith(x =>
//{
// this.BeginInvoke(new Action(() =>
// {
// txtValue.AppendText("完成了..." + System.Environment.NewLine);
// }));
//});//當一個完成后
Task.WhenAll(tasks.ToArray()).ContinueWith(x =>
{
this.BeginInvoke(new Action(() =>
{
txtValue.AppendText("都完成了..." + System.Environment.NewLine);
}));
});//當全部完成后
C#中處理任務等待和延續的不同方式。選擇哪種方法取決于你的具體需求和場景。在實際開發中,推薦使用await關鍵字來實現異步編程,因為它能更好地保持應用的響應性和性能。
該文章在 2024/3/31 1:11:31 編輯過