2009-07-29 6 views
7

複雑なタスクシーケンスを使用すると、小さなタスクごとにtry/catchブロックやChoiceレシーバーなどのコードを素早く展開できます。CCR:因果関係を使用してエラーを処理するためのベストプラクティス

ありがたいことに、CCRはタスクグラフのためのより一般的な方法で例外を処理するメカニズムを提供しているようです:因果関係。典型的な例は次のようになります。私の場合は

Port<Exception> exceptionPort = new Port<Exception>(); 
Dispatcher.AddCausality(new Causality("some job", exceptionPort)); 
Arbiter.Activate(
    dispatcherQueue, 
    Arbiter.Receive(false, exceptionPort, ex => Console.WriteLine(ex))); 
// now schedule the real tasks 

、私はシナリオ、分割「ジョブ」は、並列タスクの束に集まる/散乱を実装するためにCCRを使用してコンピューティング集約型のアプリケーションを持っています。 (それ以外に、これらのジョブのうち2つ以上が同時に実行されることがあります。)1つのタスクが失敗した場合、そのジョブの残りのタスクはすべて停止したいが、他のジョブは停止しない。 (パズルの一部が欠落していると、その結果は役に立たないので、これを続けることはCPU時間の浪費にすぎません)。

質問は、停止を実施する。

ひとつのアイデアは、次のようになります。

  1. は、1つのDispatcherのインスタンスを作成し、アプリケーションの寿命にわたってそれを維持します。
  2. 「ジョブ」(タスクのグループ)ごとに新しいDispatcherQueueを作成します。 DispatcherQueueの作成直後にCausalityを追加してください。
  3. 例外キューのハンドラでは、DispatcherQueueSuspend()を呼び出します。
  4. ディスパッチャキューを廃棄する前に、因果関係を削除してください。

この提案がベストプラクティスと考えることができるのか、そうしたおそらくかなり一般的なシナリオに対処するためのより良いアプローチがあるのだろうかと思います。

答えて

1

私にそれを伝える良い方法のようです。

関連する問題