У меня есть следующая утилита:
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 , но, похоже, не работает, есть идеи, как сделать основной метод единственным контроллером взаимодействий?