public async Task YieldAndNotify()
 {
     var task1Awaiting             = new AsyncManualResetEvent();
     var task1Resuming             = new AsyncManualResetEvent();
     var task2ReceivedNotification = new TaskCompletionSource <object?>();
     await Task.WhenAll(
         Task.Run(async delegate
     {
         await task2ReceivedNotification.Task.GetAwaiter().YieldAndNotify(task1Awaiting, task1Resuming);
     }),
         Task.Run(async delegate
     {
         await task1Awaiting.WaitAsync();
         task2ReceivedNotification.SetAsync().Forget();
         await task1Resuming.WaitAsync();
     }));
 }