走進非同步程式設計的世界 剖析非同步方法(下)

2022-07-13 15:51:13 字數 3807 閱讀 7498

本文**自:

感謝大家的支援,這是昨天發布《走進非同步程式設計的世界 - 剖析非同步方法(上)》的補充篇。

await 表示式也可以使用 try...catch...finally 結構。

internal class program

: ");   //任務狀態

console.writeline($": ");     //任務完成狀態標識

console.writeline($": ");     //任務是否有未處理的異常標識

console.read();

}///

/// 異常操作

///

///

private static async task doexceptionasync());}

catch (exception)

出現異常!");}}

圖1-1

【分析】await 表示式位於 try 塊中,按普通的方式處理異常。但是,為什麼圖中的狀態(status)、是否完成標識(iscompleted)和是否失敗標識(isfaulted)分別顯示:執行完成(rantocompletion) 、已完成(true) 和 未失敗(false) 呢?因為:任務沒有被取消,並且異常都已經處理完成!

呼叫方法可能在某個時間點上需要等待某個特殊的 task 物件完成,才執行後面的**。此時,可以採用例項方法 wait 。

internal class program

");console.read();

}///

/// 統計字元數量

///

///

///

private static async taskcountcharactersasync(string address)

}圖2-1

wait() 適合用於單一 task 物件,如果想操作一組物件,可採用 task 的兩個靜態方法 waitall() 和 waitany() 。

internal class program

: ");   

console.writeline($"t2.: ");

console.read();

}///

/// 獲取乙個隨機數

///

///

///

private static async taskgetrandomasync(int id)

);console.writeline($" 已經呼叫完成");

return num;}}

圖2-2 兩個任務的 iscompleted 屬性都顯示未完成

現在,在 main() 方法中新增兩行**(6 和 7 兩行),嘗試呼叫 waitall() 方法。

private static void main(string args)

;task.waitall(tasks);    //等待任務全部完成,才繼續執行

//iscompleted 任務完成標識

圖2-3 兩個任務的 iscompleted 屬性都顯示 true

現在,再次將第 7 行改動一下,呼叫 waitany() 方法試試。 

private static void main(string args)

;task.waitany(tasks);    //等待任一 task 完成,才繼續執行

//iscompleted 任務完成標識

console.writeline($"t1.: ");   

console.writeline($"t2.: ");

console.read();

}圖2-4 有乙個任務的 iscompleted 屬性顯示 true (完成) 就繼續執行

上節說的是如何使用 waitall() 和 waitany() 同步地等待 task 完成。這次我們使用 task.whenall() 和 task.whenany()  在非同步方法中非同步等待任務。

internal class program

: ");

console.writeline($"result: ");

console.read();

}///

/// 獲取乙個隨機數

///

///

///

private static async taskgetrandomasync()

);time++;

var t2 = task.run(() =>

);//非同步等待集合內的 task 都完成,才進行下一步操作

圖3-1 呼叫 whenall()  方法

【注意】whenall() 非同步等待集合內的 task 都完成,不會占用主線程的時間。

現在,我們把 getrandomasync() 方法內的 whenall() 方法替換成 whenany(),並且增大一下執行緒掛起時間,最終改動如下:

private static async taskgetrandomasync()

);time++;

var t2 = task.run(() =>

);//非同步等待集合內的 task 都完成,才進行下一步操作

圖3-2 呼叫 whenany() 方法

圖4-1

入門:《開始接觸 async/await 非同步程式設計》

上篇:《走進非同步程式設計的世界 - 剖析非同步方法(上)》

下篇:《走進非同步程式設計的世界 - 在 gui 中執行非同步操作》

JS中的非同步程式設計方法

js語言的執行環境是 單執行緒 所謂單執行緒,就是乙個時間只能完成乙個任務,如果有多個任務,就必須排隊。單執行緒 的壞處是 只要有乙個任務耗時很長,後面的任務就必須排隊等待,會拖延整個程式的執行。為了解決這個問題,js的任務執行模式分為兩種 同步 synchronous 和非同步 asynchron...

C 實現非同步程式設計的方法

最近在我參與的幾個.net專案中都有用到非同步程式設計,作為一名.net小白,很有必要好好地學習一下c 非同步程式設計。什麼是非同步 非同步指的就是不用阻塞當前執行緒來等待任務的完成,而是將任務扔到執行緒池中去執行,當前執行緒可以繼續向下執行,直至其它執行緒將任務完成,並 通知當前執行緒。整個任務從...

JS的非同步程式設計

generator非同步方案 async await語法糖 let url1 url1 url2 url2 ajax function getdata url,data error function err let url1 url1 url2 url2 getdata url1 then res ...