2012-02-08 7 views
1

私は2つのデカップリングクラス、クラスAとクラスBを持って、これらの2つのクラスがMircosoft CABフレームワークを使用してイベントの出版とイベントサブスクリプションで互いに通信:スレッドの同期と切り離さクラス

public class ClassA 
    { 
     [EventPublication("ActionFired", PublicationScope.WorkItem)] 
     public event EventHandler<EventArgs> ActionFired; 

     public void MethodA() 
     { 
      // Some code 1 
      DoAction1(); 
      // Some code 2 
     } 

     private void DoAction1() 
     { 
      if (ActionFired != null) 
       ActionFired(this, EventArgs.Empty); 
     } 
    } 

    public class ClassB 
    { 
     [EventSubscription("ActionFired")] 
     public void OnActionFired(object sender, EventArgs e) 
     { 
      // Here some background work using BackgroundWorker 
     } 

     private void bagroudThread_DoWork(object sender, DoWorkEventArgs e) 
     { 
      // work 
     } 

     private void bagroudThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 

     } 
    } 

ここMethodAで、私たちが呼びますDoAction1();サブスクライバはバックグラウンドワーカースレッドでそのハンドラを実行します。ここで問題となるのは、バックグラウンドワーカーが完了した後でDoAction1()を呼び出した後に実行される 'some code 2'が必要ですが、DoAction1 ()は非同期に実行され、classBバックグラウンドワーカーが作業を完了する前に 'some code 2'が実行されます。 MethodAの実行を制御するにはどうすればよいですか?

よろしく

+1

次の情報を読むことをお勧めします。http://msdn.microsoft.com/en-us/library/2e08f6yc(v=vs.100).aspx注意を払う** IAsyncResultを使用してWaitHandleを取得する.AsyncWaitHandleプロパティは、WaitHandleが通知されるまでWaitOneメソッドを使用して実行をブロックし、EndInvoke。**を呼び出します。つまり、このような場合にBackgroundWorkerを使用することはできません。 –

答えて

1

あなたは、待機イベントとのシグナリングを使用して、この

public void MethodA() 
{ 
    // Some code 1 
    DoAction1(); 

    //call wait metod: eventWaitHandle.WaitOne 

    // Some code 2 
} 


private void bagroudThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    //call set method: eventWaitHandle.Set 
} 
0

ためManualResetEventを使用することができ、問題を解決扱う、私はただのMicrosoft .NET Framework 4.0でManualResetEventSlimの導入を言及したいと思いますこれはManualResetEventの別のバージョンであり、短い待機時間に最適化されており、設定された回数だけ回転することを選択できます。また、より効率的な管理された実装を持ち、CancellationToken経由でWaitを取り消すことができます。詳細については、Signaling with Event Wait Handlesを参照してください。