Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        static async YTask FugaAsync(string name, CancellationToken token)
        {
            await YTask.InjectToStatic(token);

            await Task.Delay(300);

            await PiyoAsync(name);
        }
Esempio n. 3
0
        static async YTask HogeAsync(CancellationToken token)
        {
            await YTask.Inject(token);

            for (var i = 0; ; i++)
            {
                Console.WriteLine(i);
                await Task.Delay(1000);
            }
        }
Esempio n. 4
0
        static async YTask PiyoAsync(string name)
        {
            await YTask.InjectFromStatic();

            for (var i = 0; ; i++)
            {
                Console.WriteLine($"{name}:{i}");
                await Task.Delay(1000);
            }
        }