我有兩個異步方法Task<int> DoInt()
和Task<string> DoString(int value)
。我有第三個異步方法Task<string> DoBoth(int value)
,其目標是異步執行DoInt()
,將其輸出到DoString(int)
,結果爲DoBoth()
的結果。繼續任務<T>任務<U>沒有封鎖結果
重要的制約因素是:
- 我可能沒有源代碼,
DoInt()
或DoString()
,所以我不能 修改它們。 - 我不希望在一個任務中的任何點
- 輸出(結果),以塊必須作爲輸入傳遞到下一個
- 的最終輸出(結果)是我想成爲的
DoBoth()
結果
關鍵是我已經有異步方法(即返回任務),我想從任務管道數據,沒有阻礙,返回最初的結果在最初的任務。我可以做以下所有除了在下面的代碼不會阻止:
代碼示例:
// Two asynchronous methods from another library, i.e. can't be changed
Task<int> DoInt();
Task<string> DoString(int value);
Task<string> DoBoth()
{
return DoInt().ContinueWith<string>(intTask =>
{
// Don't want to block here on DoString().Result
return DoString(intTask.Result).Result;
});
}
由於Task<string> DoString(int)
已經是一個異步方法,我怎麼幹淨創建非阻塞延續呢?實際上,我想從現有的任務而不是從Func創建一個延續。
DoInt是否將int作爲參數?是否?你有兩種方式在你的帖子... – 2012-08-14 15:46:53
@ReedCopsey - 我修復了DoInt()的簽名。不管它是否有參數在這個例子中都不重要,但是我的例子中的不一致性令人困惑:)爲了清楚起見,也重命名了valueTask => intTask。 – MikeJansen 2012-08-14 21:04:49