Недавно я пришел к проблеме взаимоблокировки, аналогичной описанной здесь: Пример асинхронного ожидания / ожидания, который вызывает взаимоблокировку
Этот вопрос не является дубликатомниже.
Поскольку у меня есть доступ к асинхронной части кода, я смог использовать решение, описанное @ stephen-cleary в его записи в блоге здесь: http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
Поэтому я добавил ConfigureAwait(false)
к первой ожидаемой задаче.
Я не могу использовать второе решение (поместите async
везде) из-за количества затронутого кода.
Но япродолжайте спрашивать себя, что если я не могу изменить вызываемый асинхронный код (например, extern API).
Поэтому я пришел к решению, чтобы избежать мертвой блокировки.Способ к Join
заданию.Под Join
я имею в виду способ ожидания завершения целевой задачи без блокировки других задач, выполняемых в текущем потоке.
Вот код:
public static class TaskExtensions
{
public static void Join(this Task task)
{
var currentDispatcher = Dispatcher.CurrentDispatcher;
while (!task.IsCompleted)
{
// Call back the dispatcher to allow other Tasks on current thread to run
currentDispatcher.Invoke(delegate { }, DispatcherPriority.SystemIdle);
}
}
}
Я хочу подчеркнуть, что я не уверен, что правильное имя для этого метода - Join
.
Мой вопрос заключается в том, почему Task.Wait()
не реализован таким образом или может быть дополнительно использован таким образом