Явно ждать завершения асинхронного действия? - PullRequest
1 голос
/ 13 февраля 2012

У меня есть следующая утилита:

class Worker
{
  public void DoWorkAsync(Action callback)
  {
    Action work = () => Thread.Sleep(3000);
    AsyncCallback asyncCallback = (result) => callback();
    work.BeginInvoke(asyncCallback, null);
  }
}

Я использую ее следующим образом:

static void Main(string[] args)
{
  var worker = new Worker();
  worker.DoWorkAsync(() => Console.WriteLine("Completed."));

  Console.WriteLine("Hello world!");
  Console.ReadKey();
}

Это, конечно, напечатает Hello world! до Completed., так как работникработает асинхронно.

У меня вопрос, как я могу заблокировать поток, чтобы он дождался завершения действия, а затем продолжил.

Я знаю, что могу сделать это так:

static void Main(string[] args)
{
  var worker = new Worker();
  worker.DoWorkAsync(() =>
    {
      Console.WriteLine("Completed.");
      MoveOn();
    });

  Console.ReadKey();
}

static void MoveOn()
{
  Console.WriteLine("Hello world!");
}

Но так как у меня есть куча каскадных асинхронных обратных вызовов, которые должны выполняться один за другим (условно), я хочу, чтобы они все выполняли синхронно , так что есть более элегантный способждать асинхронного метода, который принимает обратный вызов в качестве параметра?

Примечание: просто чтобы убедиться, что я не могу изменить поведение класса Worker, его внешней утилиты, и у меня нет доступа кего код.

Обновление

В моем конкретном сценарии я пытаюсь взаимодействовать с пользователем из ViewModel и получать от него ответы.Мой код выполняется в модели представления, и есть метод, управляющий цепочкой каскадных взаимодействий, я хочу, чтобы этот метод решал, запускать ли определенное взаимодействие или нет.Я пробовал SLaxs 'ответ , а также пробовал this , но, похоже, не работает, есть идеи, как сделать основной метод единственным контроллером взаимодействий?

1 Ответ

4 голосов
/ 13 февраля 2012

Создайте ManualResetEvent, вызовите Set() в обратном вызове и вызовите WaitOne(), чтобы дождаться завершения операции.

...