Синхронизация потоков и развязанные классы
У меня есть 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 () выполняется асинхронно, а "некоторый код 2" выполняется до того, как фоновый работник class B завершит работу. Как я могу контролировать выполнение MethodA?
С уважением
2 ответа
Вы можете использовать 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
}
Использование сигнализации с дескрипторами событий ожидания решает проблему, я хочу упомянуть о внедрении ManualResetEventSlim в Microsoft .Net Framework 4.0, который является еще одной версией ManualResetEvent и оптимизирован для короткого времени ожидания с возможностью выбора вращения заданное количество итераций. Он также имеет более эффективную управляемую реализацию и позволяет отменять Ожидание через CancellationToken. См. Сигнализация с помощью маркеров ожидания события для получения дополнительной информации.