C async與await的使用說明

2021-08-29 20:22:25 字數 3686 閱讀 6548

c# 非同步程式設計提供了兩個關鍵字,async 和await,這裡說明下怎麼用

c# 5 引入了一種簡便方法,即非同步程式設計。此方法利用了 .net framework 4.5 及更高版本、.net core 和 windows 執行時中的非同步支援。 編譯器可執行開發人員曾進行的高難度工作,且應用程式保留了乙個類似於同步**的邏輯結構。 因此,你只需做一小部分工作就可以獲得非同步程式設計的所有好處。

用法async 用在方法定義前面,await只能寫在帶有async標記的方法中。

注意await非同步等待的地方,await後面的**和前面的**執行的執行緒可能不一樣

async關鍵字建立了乙個狀態機,類似yield return 語句;await會解除當前執行緒的阻塞,完成其他任務

0x01 簡單用法

測試**

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

using system.threading;

namespace asyncandawait_test

static

async

void

asynctest()

static task<

int>

print()

tcs.

setresult(99

);})

; thrd.

start()

;return tcs.task;}}

}

結果

這裡的結果紅框這個地方執行緒id變了,按照我的理解是非同步呼叫await前面**的執行緒和await後面**的執行緒可能不一樣

再看乙個測試例子

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

using system.threading;

namespace asyncandawait_test

static

async

void

asynctest

(taskcompletionsource<

int> tcs1, taskcompletionsource<

int> tcs2)

static task<

int>

print()

tcs3.

setresult(99

);})

; thrd.

start()

;return tcs3.task;}}

}

結果:

**裡面await用法,這裡非同步返回的是乙個task型別,通過await等待task執行完成後返回的是int,或者返回的是t模板

根據結果總結結論如下:

如果執行到await時taskcompletionsource沒有設定setresult、setcanceled、setexception中的乙個則await後面的執行緒可能出現變化(非同步操作)

如果執行到await時taskcompletionsource有設定setresult、setcanceled、setexception中的乙個則await後面的執行緒不變化(同步操作)

0x02 深入用法

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

using system.threading;

namespace asyncawaittest

static

void

main1()

static

async

void

asyncmethod1()

);console.

writeline

("asyncmethod finished!!!");

}///

///

///

static

void

main2()

///

/// 兩個task同時執行

///

static

async

void

asyncmethod2()

static task<

string

>

greetingasync

(string name,

int time=

1000))

;}static

string

greeting

(string name)

}}

結果:

非同步的異常捕獲需要注意的是要將非同步await放在try catch塊中,且返回task泛型,大概是這個意思

捕獲多個非同步的異常例子:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

using system.threading;

namespace asyncawaittest

static

async

void

testmoretaskexception()

catch

(exception ex)}}

static task<

string

>

greetingasync

(string name,

int time =

1000))

;}}}

結果:

參考文章

使用 async 和 await 的非同步程式設計 (c#)

C Async與Await的使用

大多數人還是使用的thread來使用非同步多執行緒操作,而很少有人使用async await進行非同步程式設計的。關於使用async await可以跟寫同步方法一樣去非同步程式設計。則就非常的清晰,就跟寫普通的 一樣,不用關係如何去非同步程式設計,也讓很多初級程式設計師也能夠非同步程式設計了。下面是...

C Async與Await的使用

void mymethod async task mymethodasync 前面我們提到,await語句await到最後必然呼叫了乙個啟動了新執行緒的完成實際工作的真正非同步的非同步函式,那麼如何自己定義乙個這樣的函式呢?其實很簡單,使用task類就可以建立這樣乙個函式,示例 如下 private...

c async和await 用法 阻塞與不阻塞

void pagepaint void paint string requestbody 假設有這麼個頁面布局的方法,依次對頭部 主體和底部進行渲染,頭部和底部是固定的內容,而主體需要額外請求。這裡用sleep模擬網路延時,rendering方法其實也就是對console.writeline的簡單封...