c 非同步多執行緒

2022-02-19 17:28:57 字數 2544 閱讀 3674

1.asyncrel = delegate.begininvoke實現委託非同步呼叫。

2.非同步等待 asyncrel.iscompleted用於判斷是否執行完畢 or endinvoke用於等待執行完。

3.非同步多執行緒(資源換時間)使用場景:1.任務比較多,需要提高效率,資源換時間 2.推遲執行,比如傳送簡訊可以非同步執行。

4.執行緒的特點:無序性,啟動順序不確定、執行時間不確定、結束時間不確定。

5.非同步多執行緒均與委託相關。

6.委託.begininvoke與thread.start() 效果幾乎類似,都能實現非同步多執行緒。區別:thread是前台執行緒,程式退出後,計算任務會繼續執行完畢,建構函式對應的委託沒有返回值,沒有**,也做不到,但是begininvoke的可以有返回值,也有**。

7.執行緒池:享元模式的實現。也是一種資源換時間的方式,是單例的

8.寫乙個5秒炸彈例子,通過manualresetevent.

9.task ,基於執行緒池。new taskfactory().startnew(action act);task t=new task(action act) t.start;task task=task.run(action act);等價

10.task.waitany();task.waitall();卡住當前執行緒,等待非同步執行緒執行完畢。

11.new taskfactory().continuewhenany() new taskfactory().continuewhenall() 實現執行緒結束後的**函式。

12.parallel平行計算。同時開啟多個執行緒執行但是不是非同步,底層還是通過task實現。

parallel.invoke(),parallel.for

任務:通過task封裝乙個parallel

13.異常的處理:多執行緒的委託是不允許異常的,唯一的處理方式就是通過try catch去隱藏異常並寫日誌。因為多執行緒的異常如果不等待的話是無法抓取的,因為每乙個執行緒有自己的記憶體空間,自己的執行流。

14.執行緒取消:通過cancellationtokensource這個類實現簡單的執行緒通訊,這個類就像是乙個執行緒間的全域性變數。通過設定類例項的屬性進行識別是否要停止,執行緒不能主動取消,只能通過訊號量讓其自己終止自己。cts.token可以與taskfactory的引數結合使用,將cts.token作為taskfactory.startnew的引數傳遞後,沒有啟動的任務會放棄啟動,框架自動幫我們做了判斷。

new taskfactroy.startnew(act,name,cts.token);

15執行緒安全:多個執行緒同時訪問同乙個共享變數的時候容易觸發。

解決方式:

1.鎖。private static object o=new object();

在操作公共變數的時候

lock(o),多執行緒的任務排隊進入,變成單執行緒。

2.資料隔離。解決執行緒衝突的根本辦法。

14.async與await成對出現,被async修飾的方法內部都是有task等待的。如果方法只通過async修飾,仍然是同步的效果,只使用await會報錯。

使用效果:

await task(委託);會一直等待多執行緒執行完畢,執行完畢後,主程式遇到await會直接返回,await後面的**會被包裝成乙個action作為乙個**來使用,不在占用主線程。

async修飾的方法為非同步方法缺省會返回乙個task,即使方法沒有返回值。如果有返回值則返回乙個task

外部呼叫方式:

private async taskdosomething(){}

taskt=dosomething();

long rel=t.result;//會等待非同步方法執行完畢

或者使用 t.wait();

本質上還是非同步多執行緒。

新語法:

如果是乙個async/await的方法,如果方法是沒有返回值的,則可以寫成返回值是task的形式。

private async void noreturn=private async task noreturn。推薦後者,如果沒有返回值型別,則返回乙個task,方法其他方法呼叫時進行wait。

返回值:

如果沒有返回值,則應該返回乙個task,如果返回乙個int型別的值,則應該是task

taskt=sumasync();

int irel=t.result;//訪問result,程式會一直等待計算該結果的執行緒結束 效果等價於t.wait();

16.執行緒取消:通過cancellationtokensource 的例項來完成。該類的例項是所有的執行緒都可以訪問到的,程式可以通過呼叫.cancel()方法將屬性值iscancellationrequested修改為true,其他執行緒的**可以通過判斷iscancellationrequested屬性來覺得是否要繼續執行。說白了就是乙個全域性與所有執行緒的乙個變數。

17.拿到執行緒的異常:把所有的多執行緒都放到乙個tasklist裡面,然後呼叫waitall的時候就可以全部拿到task.waitall(tasklist.toarray());異常的型別:aggregateexception。不等待的情況下,多執行緒的action(委託)是不允許異常的,方法就是try catch掉,並在catch裡寫日誌。

c 非同步 多執行緒

c 到了現在6.0時代對於非同步多執行緒也出了不少的類,從最開始thread到threadpool 到後面的task 到現在async await 也經歷了不少版本。今天乙個乙個來聊聊。首先我們要明確非同步和多執行緒不是乙個概念,非同步指向的是執行的邏輯順序不是同步的。了解了非同步多執行緒的理念後那...

C 多執行緒非同步 std async

c 11中的std async是個模板函式。std async非同步呼叫函式,在某個時候以args作為引數 可變長引數 呼叫fn,無需等待函式執行完成就可返回,返回結果是個std future物件。函式返回的值可通過std future物件的get成員函式獲取。一旦完成函式的執行,共享狀態將包含函式...

C 多執行緒技術總結(非同步)

我這裡針對現有的c 多執行緒技術進行乙個彙總,一是複習,二是方便索引,文章部份知識點 於網路,非本人原創。一 並行 非同步 1.system.threading.tasks命名空間下的 tpl 1.1 parallel.invoke 並行執行多個任務,主線程等待並行執行完畢後才開始續續執行。示例 s...