2012-05-06 8 views
1

アプリケーションでは、サービス呼び出しを行うときはいつでもTPLを使用してタスクを作成します。タスクが開始されるたびにtrueに設定されるビジーインジケータがありますタスクが完了したとき、または失敗したときにクリアされます。作成されたすべてのタスクに対してこれを行うのではなく、一般的な方法でこれを達成する方法はありますか?TPLによって作成された新しいタスクの前後の処理を一元化する

まずインスタンス:

 ComponentViewModel.Instance.IsApplicationBusy = true; 
     ComponentViewModel.Instance.BusyMessage = "Loading..."; 

     var task1 = Task.Factory.StartNew(() => DoTask1()); 
     task1.ContinueWith(antecdent => 
     { 
      ComponentViewModel.Instance.IsApplicationBusy = false; 
      CustomAction1(); 
     } 

2番目のインスタンス:サービスコールが行われるたび

 ComponentViewModel.Instance.IsApplicationBusy = true; 
     ComponentViewModel.Instance.BusyMessage = "Loading..."; 

     var task2 = Task.Factory.StartNew(() => DoTask2()); 
     task2.ContinueWith(antecdent => 
     { 
      ComponentViewModel.Instance.IsApplicationBusy = false; 
      CustomAction2(); 
     } 

同じロジックは、すべてのアプリケーションを介して繰り返される。この繰り返しを避けるためにどのような方法はありますか?

たとえば、すべてのドラッグ操作で起動されるdragstartedイベントとdragcompletedイベントがあるため、タスクのファクトリを拡張するなどして、タスクの開始やタスクの完了イベントを発生させることは可能でしょうか?

編集:行われた変更の質問はclear.Youが今始まると、タスクを終了する前に、手順は同じですが、異なる機能が、それが完了

答えて

0

EDITを実行したときに、各タスクのために実行する必要があることを観察することができ、よりになるように、それは私が質問を誤解しているようです。作成この集中管理機能は良い動きであり、このように作成することができて、「続ける、待って、開始」:

public void DoIt(Action ThingToDo) { 
    ComponentViewModel.Instance.IsApplicationBusy = true; 
    ComponentViewModel.Instance.BusyMessage = "Loading..."; 

    var loadProviderTask = Task.Factory.StartNew(ThingToDo); 
    loadProviderTask.ContinueWith(antecdent => 
    { 
     ComponentViewModel.Instance.IsApplicationBusy = false; 
    } 
} 
+0

こんにちは、申し訳ありませんがclear.Iが編集していない私の質問をされたとしてquestion.Iが異なって欲しいですタスク完了後に実行される関数 –

+0

@ VasudevanKannan、それを関数への別の代理引数として渡し、それを継続で呼び出す。 – svick

+0

@robrich、あなたは 'Task.Factory.StartNew(ThingToDo)'を意味しましたか?また、.Netの通常の命名規則は、小文字でパラメータを開始することです。 – svick