C#中的异步编程

作者: 心彻 | 来源:发表于2017-06-22 17:21 被阅读272次

假如我有6个Task任务,我需要等这6个任务都执行完了才能去执行主任务,这很简单,就是普通的顺序写代码就好了:

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个耗时的任务阻塞我主程序里后续代码的执行呢?那么就需要用到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("全部完成!");
}

此时的运行结果如下:


异步运行结果

如果我想看到异步方法里的执行过程呢?很简单,把第二个t.Wait()的注释取消即可。如果把第一个t.Wait()方法的注释取消的话,那么即便使用了async和await,这段代码也被阻塞成同步方法了。Console.Read()和t.Wait()有异曲同工之处。

就写这么多吧,比较简单。其实C#的异步编程涉及到的内容很多也很复杂,虽然只写了这么简单的一点点,但是我看了很多文章,列表如下:
C#线程
async And await异步编程活用基础
如何正确理解.NET 4.5和C# 5.0中的async/await异步编程模式?
其他一些参考:
Task.Run vs Task.Factory.StartNew
关于Console.Read()方法的一些误解!

相关文章

  • 关于C#异步编程你应该了解的几点建议

    前段时间写了一篇关于C#异步编程入门的文章,你可以点击《C#异步编程入门看这篇就够了》查看。这篇文章我们来讨论下关...

  • C#中的异步编程

    假如我有6个Task任务,我需要等这6个任务都执行完了才能去执行主任务,这很简单,就是普通的顺序写代码就好了: 但...

  • 诸子学游戏 学习服务器5

    , C#异步编程https://msdn.microsoft.com/zh-cn/magazine/ff95920...

  • C#异步编程

    什么是异步编程 什么是异步编程呢?举个简单的例子: 上面这段代码中,Main方法中的代码是按照自上而下的顺序执行的...

  • python多线程编程之异步委托

      多线程编程一向是难点,也容易出问题。之前c#中异步委托用的很爽,python中如何实现类似效果呢?   上面的...

  • 认识异步编程

    认识异步编程 本章主要介绍异步编程的概念和作用,Java中异步编程的场景以及不同异步编程场景应使用什么技术实现。 ...

  • 深入了解下Promise

    Promise 意义 Promise 的诞生与 Javascript 中异步编程息息相关,js 中异步编程主要指 ...

  • ASP.NET 谨用 async/await

    C# 5.0 引入 async/await 关键字,旨在简化异步编程模型,抛去语法糖就是 Net4.0 的 Tas...

  • AJAX入门

    AJAX(Async Javascript and Xml):在AJAX中的异步不是异步编程中的异步,而是泛指“局...

  • 异步编程二:promise模式

    书接上回,我们聊了为什么要有异步编程模式以及异步编程的魅力。本文主要聊一聊异步编程中的promise模式;prom...

网友评论

  • 高调的小丑:我想你理解错了:cry:
    高调的小丑:@心彻 你第一个里面的程序直接Task.Run就行了干嘛Wait等待呢,这样肯定就会导致所有task执行完才会输出
    高调的小丑:@心彻 不敢,Task本身就是异步的,而async和await只是C#5.0推出的简化异步编程的,把工作交给编辑器来处理,也是异步编程的形式
    心彻:@你是我的木木夕 求指教

本文标题:C#中的异步编程

本文链接:https://www.haomeiwen.com/subject/dspfcxtx.html