Синхронизация потоков и развязанные классы - PullRequest
1 голос
/ 08 февраля 2012

У меня есть 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» выполняется до того, как фоновый работник класса B завершит работу.Как я могу контролировать выполнение MethodA?

С уважением

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Вы можете использовать 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
}
0 голосов
/ 09 февраля 2012

Использование сигнализации с дескрипторами событий ожидания решает проблему, я хочу упомянуть о внедрении ManualResetEventSlim в Microsoft .Net Framework 4.0, который является еще одной версией ManualResetEvent и оптимизирован для короткого времени ожидания с возможностью выборав спиннинг для заданного количества итераций.Он также имеет более эффективную управляемую реализацию и позволяет отменять Ожидание через CancellationToken.См. Сигнализация с помощью дескрипторов ожидания события для получения дополнительной информации.

...