併發系列64章 非同步程式設計二 第三章

2022-03-02 10:33:07 字數 2455 閱讀 4305

是在第二章基礎上續寫的,主要是完結第二章例子部分。

請看下面幾個例子,感受一下。

而我們知道ui介面更新,一般來說是和更新程式非同步的,但是更新程式又要通知ui進度。

**:

public class program

public static void doloop()

setpercent(101);

});} public async static void doit()

public static void setpercent(int percent)

public static progresscallprocesstask()

; return progress;

} public static task mymethodasync(iprogressprogress=null)

}});

return task;

}}

上面我想做的事,乙個非同步的事件——doloop。

可能初學者,很喜歡用async 和 await ,可能會認為沒有async 和 await的就不是非同步事件。

async和 await的存在的作用就在於等待當前非同步事件完成,如果沒有這個需求,那麼你為什麼要寫呢?

mymethodasync 是另乙個非同步事件,裡面做的事監聽當前進度。

callprocesstask是構造乙個progress,並寫下委託,監聽percentcomplete的改變。

static void main(string args)

public static async taskdoall()

whenall 是乙個新的task,管理一組task。監聽一組task進度,當全部的task結束,這個task也結束。

使用await的時候,但是當有乙個whenall 管理的task果然有多個task失敗,那麼只會報乙個錯誤。

而使用whenall,我們的需求是要全部成功,要是有乙個不成功那麼也應該是失敗的。所以我們只要截獲乙個錯誤是正確的,系統也是這麼做的。

下面是截獲**:

public static async taskdoall()

catch

return null;

}

但是呢,有幾個運營服務商,做的相同的業務,都是免費的,但是公司保險起見呢,一起呼叫,為了確保在不同地域的請求穩定。

static void main(string args)

public static async taskdoany(string urla,string urlb)

這裡值得關注的是為什麼有兩個await:

var completedtask =await task.whenany(downloadtaska, downloadtaskb);

return await completedtask;

因為建立whenany 的task是非同步的,而建立 whenall 的task 是同步的。

值得注意的是whenany 當乙個任務完成時,那麼會返回這個task。其他任務依然還是在執行,需要考慮的是中斷乙個task更好,還是直接讓他執行完更好。這是需要考慮的地方。

比如說有3個任務,我希望只要完成任意乙個任務完成後馬上接下來完成它的後續任務。

如果我這樣寫的話:

但是得到的卻是這樣的結果。

這個結果顯示task 完成的順序是 1 ,2,3秒。

但是執行後續的順序是await的順序,也就是2,3,1.

解決方案是將3個任務,分別放在另外3個任務中執行。

static void main(string args)

public static async task processtasksasyns()

; var processingtasks = tasks.select(async t =>

); await task.whenall(processingtasks);

}static async taskdelayandreturnasync(int val)

當然後面會介紹到其他方法,但是這個解釋了,如果去實現這種需求。

還有幾個例子,下章結束例子。

程式設計珠璣第三章

第三章寫的有點太簡單了,可能作者是想在後面章節裡再詳細說吧!這一章就是作者說的幾句話印象還是很深刻。程式設計師在節省空間方面無計可施時,將自己從 中解脫出來,退回起點並記者並集 中精力研究資料,常常能有奇效。資料的 表示形式是程式設計的根本。正如人月神話的作者說 只要給我你設計的表,我就對你的程式一...

第三章 函式程式設計

函式是一段具有特定功能的 可重用的語句組,用函式名來表示並通過函式名進行功能呼叫。函式也可以看作是一段具有名字的子程式 特性 1.減少重複 2.使程式變的可擴充套件 3.使程式變得易維護 語法定義 def sayhi 函式名 print hello,i m nobody sayhi 呼叫函式 可以帶...

第三章程式設計題

每乙個程序都有乙個pcb 程序控制塊 其中包含程序執行的狀態等一系列資訊。當父程序fork 出乙個子程序,子程序執行結束後作業系統會 子程序使用的記憶體 開啟的檔案等資源。但是,依舊會保留pcb,因為其中包含子程序結束時的狀態等資訊,按理來說作業系統想把這個資訊傳遞給它的父程序。因此,父程序呼叫wa...