public void Cancel時にRegisterで登録したデリゲートが呼ばれる()
        {
            var scheduler = Task.DefaultScheduler;

            {
                // キャンセルしない場合
                var cts = new CancellationTokenSource();
                var t = Task.Run<string>(c => Cancelで戻り値が切り替わるコルーチン(10, c, cts.Token));

                scheduler.Update(20);

                Assert.IsTrue(t.IsCompleted);
                Assert.AreEqual(CompletedMessage, t.Result);
            }

            {
                // キャンセルする場合
                var cts = new CancellationTokenSource();
                var t = Task.Run<string>(c => Cancelで戻り値が切り替わるコルーチン(10, c, cts.Token));

                scheduler.Update(5);
                cts.Cancel();
                scheduler.Update(5);

                Assert.IsTrue(t.IsCompleted);
                Assert.AreEqual(CanceledMessage, t.Result);
            }
        }
        static void Main(string[] args)
        {
            var t   = new Thread(TaskLoop);
            var cts = new I.CancellationTokenSource();

            t.Start(cts.Token);

            MainAsync().Wait();

            cts.Cancel();
            t.Join();
        }
        public void キャンセルしたときにOperationCanceld例外発生()
        {
            var x = 10;
            var scheduler = Task.DefaultScheduler;

            var cts = new CancellationTokenSource();
            var t = Task.Run<double>(c => Coroutines.F1Cancelable(x, 20, c, cts.Token));

            scheduler.Update(5);
            cts.Cancel();

            // 次の1回の実行でタスクが終わるはず
            scheduler.Update();

            // この場合は IsCanceled にならない
            Assert.IsTrue(t.IsFaulted);
            Assert.AreEqual(typeof(TaskCanceledException), t.Exception.Exceptions.Single().GetType());
        }
        public void CancellationTokenを使うバージョンのRunでタスク開始するとTask_Cancel可能()
        {
            var x = 10;
            var scheduler = Task.DefaultScheduler;

            var cts = new CancellationTokenSource();
            var t = Task.Run<double>((c, ct) => Coroutines.F1Cancelable(x, 20, c, ct), cts);

            scheduler.Update(5);
            t.Cancel();

            // 次の1回の実行でタスクが終わるはず
            scheduler.Update();

            // この場合は IsCanceled にならない
            Assert.IsTrue(t.IsFaulted);
            Assert.AreEqual(typeof(TaskCanceledException), t.Exception.Exceptions.Single().GetType());
        }
 internal CancellationToken(CancellationTokenSource source) { _source = source; }