public void キャンセルトークンを渡しても_Cancelを呼ばなければ正常終了() { var x = 10; var scheduler = Task.DefaultScheduler; var t = Task.Run <double>(c => Coroutines.F1Cancelable(x, 20, c, CancellationToken.None)); while (!t.IsCompleted) { scheduler.Update(); } Assert.AreEqual(Coroutines.F1(x), t.Result); }
public void キャンセルトークンを渡しても_Cancelを呼ばなければ正常終了() { var x = 10; var runner = new SampleTaskRunner.TaskRunner(); var t = new Task <double>(c => Coroutines.F1Cancelable(x, 20, c, CancellationToken.None)); t.Start(runner); while (!t.IsCompleted) { runner.Update(); } Assert.AreEqual(Coroutines.F1(x), t.Result); }
public void TaskにCancellationTokenSourceを渡しておいて_TaskのCancelメソッド経由でキャンセルできる() { var x = 10; var runner = new SampleTaskRunner.TaskRunner(); var cts = new CancellationTokenSource(); var t = new Task <double>(c => Coroutines.F1Cancelable(x, 20, c, cts.Token)); t.Cancellation = cts; t.Start(runner); runner.Update(5); t.Cancel(); // Task.Cancel の中で1度 MoveNext して、即座にキャンセル処理が動くようにする // 挙動自体は cts.Cancel(); と同じ Assert.IsTrue(t.IsFaulted); Assert.AreEqual(typeof(TaskCanceledException), t.Error.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()); }
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 キャンセルしたときにOperationCanceld例外発生() { var x = 10; var runner = new SampleTaskRunner.TaskRunner(); var cts = new CancellationTokenSource(); var t = new Task <double>(c => Coroutines.F1Cancelable(x, 20, c, cts.Token)); t.Start(runner); runner.Update(5); cts.Cancel(); // 次の1回の実行でタスクが終わるはず runner.Update(); // この場合は IsCanceled にならない Assert.IsTrue(t.IsFaulted); Assert.AreEqual(typeof(TaskCanceledException), t.Error.Exceptions.Single().GetType()); }
public void TaskのForceCancelで強制的にタスクを止めたときはOnCompleteも呼ばれない() { var x = 10; var runner = new SampleTaskRunner.TaskRunner(); var cts = new CancellationTokenSource(); var t = new Task <double>(c => Coroutines.F1Cancelable(x, 20, c, cts.Token)); t.OnComplete(_ => { Assert.Fail(); }); t.Start(runner); runner.Update(5); t.ForceCancel(); runner.Update(); // この場合は IsCanceled に Assert.IsTrue(t.IsCanceled); }