У вас есть условие гонки, в котором работа может быть закончена до того, как вы зарегистрируетесь на событие. Чтобы избежать условия гонки, измените порядок кода, чтобы вы регистрировались на событие перед началом работы, тогда оно будет всегда вызываться независимо от того, как быстро оно закончится:
static void Main(string[] args)
{
Worker worker = new Worker();
worker.WorkCompleted += PostProcess;
worker.DoWork();
}
Edit:
Хорошо, вопрос был изменен, поэтому похоже, что вы действительно спрашиваете, как ждать, пока PostProcess
завершит выполнение. Есть несколько способов сделать это, но вам придется добавить еще немного кода.
Самый простой способ, поскольку события всегда выполняются в том же потоке, в котором они были созданы, - это вызвать Thread.Join
в потоке, который создает класс Worker
, например, при условии, что поток представлен как свойство:
worker.Thread.Join();
(Хотя, если честно, я бы, вероятно, оставил Thread
в секрете и выставил бы метод, называемый чем-то вроде WaitForCompletion
, в классе Worker
, который его вызывает).
Альтернативные методы:
Иметь WaitHandle
, вероятно, ManualResetEvent
в классе Worker
, который равен Set
, когда он завершает всю свою работу, и вызывать WaitOne
для него.
Иметь поле volatile bool complete
в классе Worker
и цикл, ожидая, пока он будет установлен на true
, используя Thread.Sleep
в теле цикла (это, вероятно, не очень хорошее решение, но это возможно).
Возможно, есть и другие варианты, но это общие.