C#中的異步編程

假如我有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()方法的一些誤解!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容