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

2022-03-04 09:34:59 字數 1948 閱讀 7560

void

pagepaint()

void

paint()

string

requestbody()

假設有這麼個頁面布局的方法,依次對頭部、主體和底部進行渲染,頭部和底部是固定的內容,而主體需要額外請求。

這裡用sleep模擬網路延時,rendering方法其實也就是對console.writeline的簡單封裝而已。。。

pagepaint執行過後,結果是這樣的:

paint start

header

body

footer

paint end

挺正常的結果,但是header渲染完以後頁面就阻塞了,這個時候使用者沒法對header進行操作。

於是就進行這樣的修正:

async

void

paint()

async taskrequestbody()

);}

執行結果變成了這樣:

paint start

header

paint end

body

footer

這樣就能在header出現之後不阻塞主線程了。

不過呢,footer一直都得等到body渲染完成後才能被渲染,這個邏輯現在看來還沒問題,因為底部要相對於主體進行布局。

然而我這時候又想給頁面加乙個廣告,而且是fixed定位的那種,管啥頭部主體想蓋住就蓋住,你們在哪它不管。

比如這樣寫:

async

void

paint()

出現了很嚴重的問題,頭部都得等廣告載入好了才能渲染,這樣顯然是不對的。

所以應該改成這樣:

async

void

paint()

async

void

paintads()

); rendering(ads);

}

這樣的執行結果就算令人滿意了:

paint start

header

paint end

adsbody

footer

總結:1.paint()加async表示是可非同步的,當裡面有awit的時候,呼叫paint的執行緒會非同步處理paint()後面的**

2.paint()裡面是同步的,想要實現非同步效果,再巢狀個加async的非同步方法.

總之async 不加awit就是非同步,加了就同步處理

例項測試:

private

void button1_click(object

sender, eventargs e)

public

async

void

aaa()

textbox1.text += "

11111111111111111111\r\n";

while (plist.count>0

)

catch

(exception exc)

}textbox1.text += "

22222222222222222222\r\n";

}public

async taskgetp(int

index)

);case3:

return

await task.run(() =>);

case4:

return

await task.run(() =>);

default

:

return

await task.run(() =>);

}}

C Async與Await的使用

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

C Async與Await的使用

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

C async與await的使用說明

c 非同步程式設計提供了兩個關鍵字,async 和await,這裡說明下怎麼用 c 5 引入了一種簡便方法,即非同步程式設計。此方法利用了 net framework 4.5 及更高版本 net core 和 windows 執行時中的非同步支援。編譯器可執行開發人員曾進行的高難度工作,且應用程式保...