C#中多线程的使用(3)async/awaite

一、简介

在这最后一部分,记录一下async/awaite这一组关键字的用法, async/await这一组关键字是在.net framework 4.5开始才有的,async 是用来修饰方法,await用于方法内部等待异步的完成,若在只使用async而未使用await则该方法会以同步的方式执行,所以尽量将async/await成对使用。

二、使用

2.1 在异步方法中,当程序执行到await时,先进入方法,将属于当前线程的语句全部执行,异步计算会放在线程池中计算

public static void Main()
{
    Test1();//1
    Console.WriteLine("end");//2
}

private static async Task Test1()
{
    Console.WriteLine("开始");//3
    await Test2();//4
    Console.WriteLine("结束");//5
}
private static async Task Test2()
{
    Console.WriteLine("开始2"); //6
    await Task.Delay(3000);//7
    Console.WriteLine("结束2");//8
}

执行结果: 开始 开始2 end 结束2 结束

程序刚开始执行时,进入方法Test1(),执行Console.WriteLine("开始"),然后进入方法Test2(),执行Console.WriteLine("开始2"),当遇到异步方法await Task.Delay(3000)时,程序回到await Test2(),因为这里也有await 修饰,所以当前线程回到Main()中继续向下执行Console.WriteLine("end"),当异步方法Task.Delay(3000)执行完毕,则当前线程接着执行await 下面的程序 Console.WriteLine("结束2"),执行完Test2()则回到Test1()向下执行Console.WriteLine("结束")

 

 

2.2 带返回值的异步Task

private static async Task<int> GetSumAsync(int count)
{
    int sum = 0;
    await Task.Run(() =>
                   {
                       for (int i = 0; i < count; i++)
                       {
                           Thread.Sleep(500);
                           sum += count;
                       }
                   });
    return sum;
}

public static void Main()
{
    int sum = await GetSumAsync(10);
    Console.WriteLine(sum);//打印计算结果
}

 

posted @ 2022-11-21 19:17  just--like  阅读(210)  评论(0编辑  收藏  举报