Кто-нибудь может объяснить, почему этот код просто заходит в тупик после срабатывания WhenAll?
Основной код:
class AsyncTests
{
public async void Start()
{
Console.WriteLine($"Thread:{Thread.CurrentThread.ManagedThreadId} - starting whole process, calling await DoWork1()");
await Task.WhenAll(DoWork1(), DoWork2());
Console.WriteLine($"Thread:{Thread.CurrentThread.ManagedThreadId} - finished awaiting DoWork1 and DoWork2");
}
public async Task DoWork1()
{
Console.WriteLine($"Thread:{Thread.CurrentThread.ManagedThreadId} - starting DoWork1");
await DoNothing();
Console.WriteLine($"Thread:{Thread.CurrentThread.ManagedThreadId} - finished DoWork1");
}
public async Task DoWork2()
{
Console.WriteLine($"Thread:{Thread.CurrentThread.ManagedThreadId} - starting DoWork2");
await DoNothing();
Console.WriteLine($"Thread:{Thread.CurrentThread.ManagedThreadId} - finished DoWork2");
}
public Task DoNothing() { return new Task(() => { /* do nothing */ }); }
}
Код управления программой:
static void Main(string[] args)
{
var x = new AsyncTests();
Console.WriteLine($"Thread:{Thread.CurrentThread.ManagedThreadId} - Main ... calling Start()");
Task.Run(() => x.Start());
Console.WriteLine($"Thread:{Thread.CurrentThread.ManagedThreadId} - Main ... start is running");
Console.ReadKey();
}
Вывод:
Thread:1 - Main ... calling Start()
Thread:1 - Main ... start is running
Thread:4 - starting whole process, calling await DoWork1()
Thread:4 - starting DoWork1
Thread:4 - starting DoWork2
ОБНОВЛЕНИЕ
Чтобы сделать это немного понятнее, давайте изменим его так, чтобы DoNothing фактически вызывал Thread.Sleep (2000) и мою цельсостоит в том, чтобы запустить два потока одновременно и хотеть использовать шаблон async / await для достижения этого.
Если я изменю «DoNothing» на асинхронную задачу, которая выполняет сон, то мне скажут, что мне нужно await
операторы там.А это значит, что мне нужно написать еще один async
метод, которого следует ожидать.Итак, как лучше всего завершить эту цепочку вызовов с точки зрения операторов?
Может ли кто-нибудь показать лучший пример того, как достичь вышеуказанного?