1

クラス A とクラス B の 2 つの分離されたクラスがあります。これら 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() を呼び出します。イベントパブリケーションを起動し、サブスクライバーはバックグラウンドワーカースレッドでハンドラーを実行します。ここでの問題は、バックグラウンドワーカーが完了した後にのみ実行される「コード2」(DoAction1()を呼び出した後に来る)が必要なことですが、ここではDoAction1 () は非同期で実行され、classB バックグラウンド ワーカーが作業を完了する前に「some code 2」が実行されます。MethodA の実行を制御するにはどうすればよいですか?

よろしく

4

2 に答える 2

1

これにはManualResetEventを使用できます

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
}
于 2012-02-08T14:01:58.040 に答える
0

待機イベント ハンドルでシグナリングを使用すると、問題が解決します。Microsoft .Net Framework 4.0 での ManualResetEventSlim の導入について言及したいと思います。これは、ManualResetEvent の別のバージョンであり、スピンを選択する機能を備えた短い待機時間に最適化されています。設定された反復回数。また、より効率的なマネージド実装があり、CancellationToken を介して Wait をキャンセルできます。詳細については、イベント待機ハンドルによるシグナリングを参照してください。

于 2012-02-09T09:43:50.230 に答える