私はいくつかの非同期/待機しているコードを連鎖したタスクに変換しているので、リリースされたフレームワークで使用できます。 awaitコードはTaskCompletionSourceのないタスクチェーン?
Task<TraumMessage> Invoke(string verb) {}
Task<TraumMessage> Memorize() {}
私はMemorize
で作成したタスクを返すためにチェーンInvoke
とMemorize
に期待していたが、Task<Task<TraumMessage>
における結果は、この
public async Task<TraumMessage> Get() {
var message = await Invoke("GET");
var memorized = await message.Memorize();
return memorized;
}
のように見えます。私が終わってきたソリューションは、私の信号としてTaskCompletionSource<TraumMessage>
は次のとおりです。TaskCompletionSource
せずにこれを実現する方法は
public Task<TraumMessage> Get() {
var completion = new TaskCompletionSource<TraumMessage>();
Invoke("GET").ContinueWith(t1 => {
if(t1.IsFaulted) {
completion.SetException(t1.Exception);
return;
}
t1.Result.Memorize().ContinueWith(t2 => {
if(t2.IsFaulted) {
completion.SetException(t2.Exception);
return;
}
completion.SetResult(t2.Result);
});
});
return completion.Task;
}
ありますか?
Jon SkeetのEduAsyncシリーズのおかげで、私はasync/awaitのフードの下で見ました。そして、それは基本的にステートマシンを実行するクラスを構築します。私はこれまでもこのアプローチを使用してきましたが、TCSのアプローチよりもずっと面倒です。 –
ああ、これについてもっと考えてみましたが、第2のタスクの継続の結果を待っている第1のタスクの継続をブロックしない限り、純粋な継続の方法はありません。もし星が一直線に並んでいれば、盗みはほとんどないかもしれませんが、理論的には2番目のタスクがどのように作成されているかを知ることはできません(タスクスケジューラやAPMなど)。したがって、結果を待っているスレッドをブロックすると仮定しなければなりません。もし私が何を意味しているか知りたいのであれば、私は答えを更新します。 –
http://blogs.msdn.com/b/pfxteam/archive/2010/11/21/10094564.aspx Stephen Taubはこのパターンを実装するために 'Then'というヘルパーメソッドで 'TaskCompletionSource'をラップします。 – Govert