2012-02-08 7 views
1

У меня есть 2 отсоединенные классы, класс А и класс В, эти два класса общаются друг с другом с публикации событий и подписки на событие с использованием фреймворка 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?

С уважением

+1

Вы должны прочитать следующую информацию: http://msdn.microsoft.com/en-us/library/2e08f6yc(v=vs.100).aspx обратите внимание на ** Получите WaitHandle, используя IAsyncResult .AsyncWaitHandle, используйте метод WaitOne для блокировки выполнения до тех пор, пока не будет сигнализирован WaitHandle, а затем вызовите EndInvoke. ** Другими словами, вы не сможете использовать BackgroundWorker в таком случае. –

ответ

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 
} 
0

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