C#異步編程 Task await的理解


async/await是C#5.0中推出的,先上用法:

static void Main(string[] args)
{
    Console.WriteLine("-------主線程啟動-------");
    Task<int> task = GetStrLengthAsync();
    Console.WriteLine("主線程繼續執行");
    Console.WriteLine("Task返回的值" + task.Result);
    Console.WriteLine("-------主線程結束-------");
}
 
static async Task<int> GetStrLengthAsync()
{
    Console.WriteLine("GetStrLengthAsync方法開始執行");
    //此處返回的<string>中的字符串類型,而不是Task<string>
    string str = await GetString();
    Console.WriteLine("GetStrLengthAsync方法執行結束");
    return str.Length;
}
 
static Task<string> GetString()
{
   //Console.WriteLine("GetString方法開始執行")
    return Task<string>.Run(() =>
    {
        Thread.Sleep(2000);
        return "GetString的返回值";
    });
}

 

async用來修飾方法,表明這個方法是異步的,聲明的方法的返回類型必須為:void,Task或Task<TResult>。

await必須用來修飾Task或Task<TResult>,而且只能出現在已經用async關鍵字修飾的異步方法中。通常情況下,async/await成對出現才有意義,

看看運行結果:

可以看出來,main函數調用GetStrLengthAsync方法后,在await之前,都是同步執行的,直到遇到await關鍵字,main函數才返回繼續執行。

那么是否是在遇到await關鍵字的時候程序自動開啟了一個后台線程去執行GetString方法呢?

現在把GetString方法中的那行注釋加上,運行的結果是:

大家可以看到,在遇到await關鍵字后,沒有繼續執行GetStrLengthAsync方法后面的操作,也沒有馬上反回到main函數中,而是執行了GetString的第一行,以此可以判斷await這里並沒有開啟新的線程去執行GetString方法,而是以同步的方式讓GetString方法執行,等到執行到GetString方法中的Task<string>.Run()的時候才由Task開啟了后台線程!

那么await的作用是什么呢?

可以從字面上理解,上面提到task.wait可以讓主線程等待后台線程執行完畢,await和wait類似,同樣是等待,等待Task<string>.Run()開始的后台線程執行完畢,不同的是await不會阻塞主線程,只會讓GetStrLengthAsync方法暫停執行。

那么await是怎么做到的呢?有沒有開啟新線程去等待?

只有兩個線程(主線程和Task開啟的線程)!至於怎么做到的(我也不知道......>_<),大家有興趣的話研究下吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM