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# 最簡單的使程序單進程運行的方法

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章