Синхронизация потоков и развязанные классы

У меня есть 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. См. Сигнализация с помощью маркеров ожидания события для получения дополнительной информации.

Другие вопросы по тегам