线程同步和解耦类

时间:2012-02-08 13:57:49

标签: c# multithreading scsf

我有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后台工作者完成工作之前执行“some code 2”。 如何控制MethodA的执行?

此致

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

使用带有等待事件句柄的信号来解决问题,我只想提一下在Microsoft .Net Framework 4.0中引入ManualResetEventSlim,它是ManualResetEvent的另一个版本,它可以在短时间内进行优化,并且能够选择旋转一定数量的迭代。它还具有更高效的托管实现,并允许通过CancellationToken取消等待。有关详细信息,请参阅Signaling with Event Wait Handles