我有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的执行?
此致
答案 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。