C#中的异步编程

假如我有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#中的异步编程)