2012-03-06 17 views
7

で取り扱うタスクの組成とエラーが、私は次のような構造を持つメソッドを持っているTPL

  • secondTaskはそう
  • 決定するまで InitializeAsyncによって返されたタスクが完了したと見なされていません
  • secondTaskfirstTaskが成功した場合にのみ実行されます。
  • いずれかが失敗した場合firstTaskまたはsecondTaskは、全体的なタスクが失敗する原因となります。

同じ機能を達成しながら、これを表現するクリーンで簡単な方法があるかどうかは疑問です。私は.NET 4.0を使用していますが、4.5でこれをより簡単にするかどうかにも関心があります。

別のオプションは、(あなたが返す親タスク内にネスト)付属の子タスクとして、あなたの二つのタスクを作成することです
+1

4.5でこれを行うには、await/async機能を使用し、非同期機能内でタスクをまとめてみてください。 – Carsten

+0

私は同じ問題を抱えていましたが、スティーブンギデオンの答えは次のようにつながっていると思う。それはソリューションで私の最初の試みよりもはるかにクリーンで、より明らかにすべてのコーナーケースを処理します。 – shambulator

答えて

5

あなたが記述のように、私はthis blog articleからチェーンタスクへのアイデアを使用。特に、のセクションを参照してください。。ないContinueWithになり、彼のバージョンは、あなただけではなく、あなたのような方法を渡すのタスクを返す関数に渡すことを想定している

さておき、Thenはあなたがチェーンにできるようにする必要がありますSelectManyにあなたはかなり近いにつれ句からのLINQを介したタスク。私はこれを、ほとんどの場合シンタックスオプションとして、.NET 4.5で非同期/待機するまで言及していますが、実際には自分自身を使用していません。

+0

これは、私が驚いている、クリーンで汎用的な解決策です.BuCLには含まれていませんが、 'TaskCompletionSource'は実装するのに十分単純です。 'ContinueWith'のようなシグネチャが必要な場合は、キャンセルトークン、スケジューラなどを指定するためのオーバーロードを提供する必要があります。 – shambulator

+1

これは、私の理解の中で必要とされる正確な穴です。どうもありがとう。 –

関連する問題