public void AwaitUnsafeOnCompleted <TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { if (awaiter is CancellationTokenInjector cti) { this.cancellationTokenInjector = cti; stateMachine.MoveNext(); return; } if (this.cancellationTokenInjector.CancellationToken.CanBeCanceled) { var moveNext = new Action(stateMachine.MoveNext); awaiter.UnsafeOnCompleted(() => { var ct = this.cancellationTokenInjector.CancellationToken; if (ct.IsCancellationRequested) { this.completionSource.SetException(new OperationCanceledException(ct)); return; } if (this.cancellationTokenInjector.RestoreInjection) { _ = YTask.InjectToStatic(ct); } moveNext(); }); } else { awaiter.UnsafeOnCompleted(stateMachine.MoveNext); } }
static async YTask FugaAsync(string name, CancellationToken token) { await YTask.InjectToStatic(token); await Task.Delay(300); await PiyoAsync(name); }
static async YTask HogeAsync(CancellationToken token) { await YTask.Inject(token); for (var i = 0; ; i++) { Console.WriteLine(i); await Task.Delay(1000); } }
static async YTask PiyoAsync(string name) { await YTask.InjectFromStatic(); for (var i = 0; ; i++) { Console.WriteLine($"{name}:{i}"); await Task.Delay(1000); } }