C# 异步编程Task(三) async、await

一、async和await两个修饰符

C#5.0的时候引入了async和await两个修饰符,成为异步编程的核心关键字。
async 是修饰符,表明方法含有异步操作,但并不是说整个方法是异步的。async修饰的方法会先同步执行到第一处await的地方而后开始异步。
await可以理解为一异步特有的“return”。即返回一个正在运行的异步过程。并且等待该异步过程结束后再继续向await的下一句运行。

 

private static async void MainAsync()
{
    Console.WriteLine("Application Start");
    await AsyncTask1();//编译报错,“无法等待void”
    Console.WriteLine("Application End");
}

private static async void AsyncTask1()
{
    Console.WriteLine("AsyncVoid1");
    Thread.Sleep(1000);
    Console.WriteLine("AsyncVoid1: befor await");
    await Task.Run(() =>
    {
        Console.WriteLine("AsyncVoid1: Task Runing");
        Thread.Sleep(2000);
    });
    Console.WriteLine("AsyncVoid1: after await");
}
static void Main(string[] args)
{
     //控制台Main入口不能加async
      MainAsync();
}
//方法内有await时,方法必须被async修饰。
private static async void MainAsync()
{
    Console.WriteLine("Application Start");
    await AsyncTask1();
    Console.WriteLine("Application End");
}

运行结果:

Application Start
AsyncVoid1
AsyncVoid1: befor await
AsyncVoid1: Task Runing
AsyncVoid1: after await
Application End

 

二、异步返回类型

async是方法的修饰,其对应的方法的返回值有

void
Task
Task<T>
任何具有可访问的 GetAwaiter 方法的类型(GetAwaiter 方法返回的对象必须实现 ystem.Runtime.CompilerServices.ICriticalNotifyCompletion 接口)。
IAsyncEnumerable(对于返回异步流的异步方法)。
常用的是前三个。暂且置整理前三者的区别与不同。


三、async Task
返回Task类型的。个人概括的说,就是“执行操作但不返回任何值的异步方法”。即await 等待的一个无返回值的Task。

private static async Task<int> AsyncFuncReturn1()
{
    await Task.Run(() => 
    { 
        Thread.Sleep(500); 
    });            
    return 1;
}
private static Task<int> AsyncFuncReturn2()
{
    return Task<int>.Run(() => 
    { 
        Thread.Sleep(500); 
        return 1; 
    });
}

 

四、await 和 Task.Wait()/Task.Result

await 和Task.Wait()的作用都有等待任务结束的功能,不同的是,就想前面说的,await还有一层“return”的意思,或者说更像“yield”。即让await所在方法的被调用者可以继续下一步操作。(这里只是说“可以”,即对外产生这样的能力,而如果await所在方法返回的值是void类型,调用者就不能强制同步了)

 

更多:

C# 异步编程Task整理(一)

C# 异步编程Task整理(二)异常捕捉

C# 最简单的使程序单进程运行的方法

 

posted @ 2024-04-20 16:37  天马3798  阅读(207)  评论(0编辑  收藏  举报