AwaitAsync 非同步和多執行緒)

2022-01-15 15:48:25 字數 2887 閱讀 1964

這個大佬寫的文章,我還是很喜歡的

這篇文章是討論在.net中使用程序內com元件時的公寓模型,以乙個示例直觀演示stathread和mtathread的作用和區別。

c#5.0,.net framework4.5

async/await是語法糖,本身就跟編譯器提供的功能。

在winform中,是乙個stathread

在winform中使用await/async偶爾會出現一些意外,所以不建議在winform中使用await/async

await/async關鍵字,在任何乙個方法都可以增加async,await放在task前面,一般成對出現,只有async是沒有意義的,有警告,只有await的時候會報錯,編譯直接報錯,await/async要麼不用,要麼用到底。  

主線程呼叫async/await方法,主線程遇到await返回只能後續動作,await後面的**會等著task任務完成後再繼續執行,await是主線程完成的,其實就像是把await後面的**包裝成乙個continue的**動作,然後這個**動作也可能是tas**程,也可能是新的子執行緒,也可能是主線程。

乙個async方法,如果沒有返回值,可以方法宣告返回task

有了await之後,在這個方法中,**是按照順序從上往下執行的,但是,為什麼不直接寫乙個同步方法,還要寫await呢?

如果不寫await的話,task.run()會開啟乙個執行緒,不會足額色主線程,這樣在最後的結果result就是0了。

await/async能夠用同步的方式編寫**,但是又是非阻塞的。

原理**和使用建議:

public

class

awaitasyncilspy "

); async();

console.writeline($

"aaa2 ");

}public

static

async

void

async()

");await task.run(() =>");

});console.writeline($

"ccc4 ");}}

awaitasynclibrary.awaitasyncilspy.show();

console.writeline(

"hello word!

");

這樣的**,輸出的順序是是什麼?

await/async能夠用同步的方式編寫**,但又是非阻塞的

async方法在編譯之後會生成乙個狀態機(實現了iasyncstatemachine介面)

狀態機:初始化狀態----執行就修改狀態1-----再執行就修改狀態變為0-----執行就修改狀態變為1----如果出現其他狀態就結束了。

就像是紅綠燈那樣,永遠的死迴圈下去。

async方法裡面的邏輯其實都放在了movenext----主線程new乙個狀態機1-----主線程呼叫movenext-----指向了await之前的東西----啟動task----主線程改狀態為0----回去幹自己的事了-----子執行緒movenext----狀態又回歸-1了-----再執行後續的邏輯------如果需要還可以繼續迴圈。

非同步程式設計,await async入門

非同步程式設計模型 net支援3種非同步程式設計模式 msdn 推薦大家先看我寫的,再針對各個部分檢視msdn的詳細內容 1 非同步程式設計模型 apm asynchronous programming model 使用 iasyncresult 設計模式的非同步操作是通過名為 beginopera...

非同步多執行緒 await async

await async 是乙個語法糖,本身不會產生新的執行緒,但是依託於task而存在,所以執行時,也是會有多執行緒。async可以沒有await,但await一定要有async,並且只能只能出現在task前面。原來沒有返回值的方法,用await async修飾後,會返回task 原來有返回值t的方...

ThreadPoolExecutor 多執行緒

from concurrent.futures import threadpoolexecutor,wait,all completed from queue import queue myqueue queue 佇列,用於儲存函式執行結果。多執行緒的問題之一 如何儲存函式執行的結果。def thr...