假如我有6個Task任務,我需要等這6個任務都執(zhí)行完了才能去執(zhí)行主任務,這很簡單,就是普通的順序?qū)懘a就好了:
static void Main(string[] args)
{
Test();
Console.WriteLine("Main End");
}
static void Test()
{
var task1 = Task.Run(() => {
Thread.Sleep(6000);
Console.WriteLine("task1");
});
var task2 = Task.Run(() => {
Thread.Sleep(2000);
Console.WriteLine("task2");
});
var task3 = Task.Run(() => {
Thread.Sleep(3000);
Console.WriteLine("task3");
});
var task4 = Task.Factory.StartNew(() => {
Thread.Sleep(4000);
Console.WriteLine("task4");
});
var task5 = Task.Run(() => {
Thread.Sleep(5000);
Console.WriteLine("task5");
});
Task.WaitAny(task1, task2, task3, task4, task5);
Console.WriteLine("WaitAny");
Task.WaitAll(task1, task2, task3, task4, task5);
Console.WriteLine("WaitAll");
}
但是,如果我不希望這6個耗時的任務阻塞我主程序里后續(xù)代碼的執(zhí)行呢?那么就需要用到async和await了,代碼如下:
static void Main(string[] args)
{
Task t=Test();
//t.Wait();
Console.WriteLine("Main End");
//t.Wait();
}
static async Task Test()
{
var task1 = Task.Run(() => {
Thread.Sleep(6000);
Console.WriteLine("task1");
});
var task2 = Task.Run(() => {
Thread.Sleep(2000);
Console.WriteLine("task2");
});
var task3 = Task.Run(() => {
Thread.Sleep(3000);
Console.WriteLine("task3");
});
var task4 = Task.Factory.StartNew(() => {
Thread.Sleep(4000);
Console.WriteLine("task4");
});
var task5 = Task.Run(() => {
Thread.Sleep(5000);
Console.WriteLine("task5");
});
await Task.WhenAny(new Task[] { task1, task2, task3, task4, task5 });
Console.WriteLine("有一個任務完成");
await Task.WhenAll(new Task[] { task1, task2, task3, task4, task5 });
Console.WriteLine("全部完成!");
}
此時的運行結(jié)果如下:

異步運行結(jié)果
如果我想看到異步方法里的執(zhí)行過程呢?很簡單,把第二個t.Wait()的注釋取消即可。如果把第一個t.Wait()方法的注釋取消的話,那么即便使用了async和await,這段代碼也被阻塞成同步方法了。Console.Read()和t.Wait()有異曲同工之處。
就寫這么多吧,比較簡單。其實C#的異步編程涉及到的內(nèi)容很多也很復雜,雖然只寫了這么簡單的一點點,但是我看了很多文章,列表如下:
C#線程
async And await異步編程活用基礎(chǔ)
如何正確理解.NET 4.5和C# 5.0中的async/await異步編程模式?
其他一些參考:
Task.Run vs Task.Factory.StartNew
關(guān)于Console.Read()方法的一些誤解!