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; }