Объявление методов «async» не делает ваш код многопоточным.Вы можете предположить, что ваш код будет работать синхронно до тех пор, пока что-то «ожидается».
Проблема здесь в том, что Job2 никогда не вернется, поэтому ваш код застрянет.Но, например (а не фактическое решение), если вы сделали что-то вроде этого:
public async Task Job2()
{
await Task.Delay(1000);
handle.WaitOne();
Console.WriteLine("Doing Job2 work");
}
Ваша программа фактически завершит работу, потому что функция станет асинхронной и вернется к вызывающей стороне, как только будет задержкаawaited.
Следует избегать использования примитивов синхронизации, таких как "EventWaitHandle / ManualResetEvent", в TPL (async / await), поскольку они физически блокируют поток, а не освобождают его и ожидают обратного вызова.
Вот актуальное решение:
public class Tasks
{
SemaphoreSlim semaphore = new SemaphoreSlim(0);
public async Task Job1()
{
Console.WriteLine("Finished job1");
semaphore.Release();
}
public async Task Job2()
{
await semaphore.WaitAsync();
Console.WriteLine("Doing Job2 work");
}
}
class Program
{
static async Task Main(string[] args)
{
Tasks seq = new Tasks();
var t2 = seq.Job2();
var t1 = seq.Job1();
await Task.WhenAll(t1, t2);
Console.WriteLine("finished both");
}
}