我有一個Task<T> t1
。我想在t1
完成後運行另一個Task t2
。我選擇使用t1
的.ContinueWith
方法。ContinueWith爲什麼通過任務作爲參數
void ThenFrob(Task<Frobber> t1) {
t1.ContinueWith(frobber => frobber.Frob())
}
除此之外,我不能這樣做,因爲Task<T>
Action參數傳遞的Task<T>
,而不是T
本身。相反,我必須將傳遞給我的動作的參數的結果與它進行交互。
void ThenFrob(Task<Frobber> t1) {
t1.ContinueWith(frobberTask => {
var frobber = frobberTask.Result;
frobber.frob();
});
}
如果ContinueWith的點到另一個動作加入連鎖,爲什麼不語言設計者簡單地通過了前一個任務的結果呢?或者,如果非通用任務期望進行無參數操作?
以前的任務結果是什麼,如果任務拋出異常? – PetSerAl
根據非並行開發或Promises思考,我期望有一個不同的方法簽名來處理異常。繼續暗示我以前的任務已經完成,沒有錯誤。 – psaxton
順便說一句,我認爲使用'ContinueWith(async t => {var result = await t ...})'而不是'.Result'是一種更好的做法,即使是有人會複製粘貼動作的最小風險到'.Result'可能會阻塞該線程的外部代碼中。 –