public void TaskCancellationManager_CancelledAfterCompleted() { var mgr = new TaskCancellationManager<int>(); mgr.Add(42, _ => Task.CompletedTask); mgr.Cancel(42); // Not throwing implies success }
public async Task TaskCancellationManager_CancelledAfterCompleted() { var mgr = new TaskCancellationManager <int>(); await mgr.Add(42, _ => Task.CompletedTask); mgr.Cancel(42); // Not throwing implies success }
public void TaskCancellationManager_CancelledAfterCompleted() { var mgr = new TaskCancellationManager <int>(); mgr.Add(42, _ => Task.FromResult(true)); mgr.Cancel(42); // Not throwing implies success }
public void TaskCancellationManager_CancelTask() { var enter = new AutoResetEvent(false); var exit = new AutoResetEvent(false); var mgr = new TaskCancellationManager<int>(); mgr.Add(42, async token => { var tcs = new TaskCompletionSource<bool>(); using (token.Register(() => tcs.SetResult(true))) { enter.Set(); await tcs.Task; exit.Set(); } }); Assert.IsTrue(enter.WaitOne()); mgr.Cancel(42); Assert.IsTrue(exit.WaitOne()); }
public async Task TaskCancellationManager_CleanedUpAfterError() { var enter = new AutoResetEvent(false); var mgr = new TaskCancellationManager <int>(); var t = mgr.Add(42, token => { return(Task.Run(() => { enter.WaitOne(); throw new InvalidOperationException(); })); }); Assert.IsNotNull(t); Assert.AreEqual(1, mgr.PendingOperationCount); enter.Set(); await AssertEx.ThrowsAsync <InvalidOperationException>(async() => await t); Assert.AreEqual(0, mgr.PendingOperationCount); }
/// <summary> /// Initiates the network fetch and informs the producer when a /// response is received via the provided callback. /// </summary> /// <param name="fetchState"> /// The fetch-specific state. /// </param> /// <param name="callback"> /// The callback used to inform the network fetch producer. /// </param> public override void Fetch( FetchState fetchState, INetworkFetcherCallback callback) { _tasks.Add(fetchState.Id, token => FetchASync(fetchState, callback, token)); fetchState.Context.AddCallbacks( new BaseProducerContextCallbacks( () => { bool isCanceled = _tasks.Cancel(fetchState.Id); if (isCanceled) { callback.OnCancellation(); } }, () => { }, () => { }, () => { })); }
public async Task TaskCancellationManager_CleanedUpAfterComplete() { var enter = new AutoResetEvent(false); var exit = new AutoResetEvent(false); var mgr = new TaskCancellationManager<int>(); var t = default(Task); mgr.Add(42, token => { return t = Task.Run(() => { enter.WaitOne(); return; }); }); Assert.IsNotNull(t); Assert.AreEqual(1, mgr.PendingOperationCount); enter.Set(); await t; Assert.AreEqual(0, mgr.PendingOperationCount); }
public async Task TaskCancellationManager_CleanedUpAfterComplete() { var enter = new AutoResetEvent(false); var exit = new AutoResetEvent(false); var mgr = new TaskCancellationManager <int>(); var t = mgr.Add(42, token => { return(Task.Run(() => { enter.WaitOne(); return; })); }); Assert.IsNotNull(t); Assert.AreEqual(1, mgr.PendingOperationCount); enter.Set(); await t; Assert.AreEqual(0, mgr.PendingOperationCount); }
public async Task TaskCancellationManager_CancelTask() { var enter = new AutoResetEvent(false); var exit = new AutoResetEvent(false); var mgr = new TaskCancellationManager <int>(); var t = mgr.Add(42, async token => { var tcs = new TaskCompletionSource <bool>(); using (token.Register(() => tcs.SetResult(true))) { enter.Set(); await tcs.Task; exit.Set(); } }); Assert.IsTrue(enter.WaitOne()); mgr.Cancel(42); Assert.IsTrue(exit.WaitOne()); await t; }
public async Task TaskCancellationManager_CleanedUpAfterError() { var enter = new AutoResetEvent(false); var mgr = new TaskCancellationManager<int>(); var t = default(Task); mgr.Add(42, token => { return t = Task.Run(() => { enter.WaitOne(); throw new InvalidOperationException(); }); }); Assert.IsNotNull(t); Assert.AreEqual(1, mgr.PendingOperationCount); enter.Set(); await AssertEx.ThrowsAsync<InvalidOperationException>(async () => await t); Assert.AreEqual(0, mgr.PendingOperationCount); }