1

我有 2 个解耦类,A 类和 B 类,这两个类使用 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 后台工作人员完成工作之前执行“一些代码 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 取消等待。有关更多信息,请参阅使用事件等待句柄发送信号

于 2012-02-09T09:43:50.230 回答