public void TaskCancellationManager_CancelledAfterCompleted()
        {
            var mgr = new TaskCancellationManager<int>();
            mgr.Add(42, _ => Task.CompletedTask);
            mgr.Cancel(42);

            // Not throwing implies success
        }
Пример #2
0
        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());
        }
Пример #5
0
        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);
        }
Пример #6
0
        /// <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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }