是在第二章基礎上續寫的,主要是完結第二章例子部分。
請看下面幾個例子,感受一下。
而我們知道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...