Пример #1
0
        public void TryAddCompletionCallback_FailsIfOperationIsCompleted()
        {
            // Arrange
            var op = new AsyncCompletionSource();

            op.SetCanceled();

            // Act
            var result = op.TryAddCompletionCallback(_ => { }, null);

            // Assert
            Assert.False(result);
        }
Пример #2
0
        public void TryAddContinuation_ExecutesWhenOperationCompletes()
        {
            // Arrange
            var op           = new AsyncCompletionSource();
            var continuation = Substitute.For <IAsyncContinuation>();

            op.TryAddCompletionCallback(continuation);

            // Act
            op.SetCompleted();

            // Assert
            continuation.Received(1).Invoke(op);
        }
Пример #3
0
        public async Task TryAddCompletionCallback_IsThreadSafe()
        {
            // Arrange
            var op      = new AsyncCompletionSource();
            var counter = 0;
            var d       = new Action <IAsyncOperation>(CompletionCallback);

            void CompletionCallback(IAsyncOperation o)
            {
                Interlocked.Increment(ref counter);
            }

            void TestMethod()
            {
                for (var i = 0; i < 10000; ++i)
                {
                    op.TryAddCompletionCallback(d);
                }
            }

            void TestMethod2()
            {
                for (var i = 0; i < 10000; ++i)
                {
                    op.RemoveCompletionCallback(d);
                }
            }

            TestMethod();

            // Act
            await Task.WhenAll(
                Task.Run(new Action(TestMethod)),
                Task.Run(new Action(TestMethod)),
                Task.Run(new Action(TestMethod2)),
                Task.Run(new Action(TestMethod)));

            // Assert
            op.SetCompleted();
            Assert.Equal(30000, counter);
        }
Пример #4
0
        public async Task TryAddCompletionCallback_ContinuationsAreRunOnCorrectSynchronozationContext()
        {
            // Arrange
            var op        = new AsyncCompletionSource();
            var op2       = new AsyncCompletionSource();
            var sc        = Substitute.For <SynchronizationContext>();
            var tid       = 0;
            var tidActual = 0;

            op.TryAddCompletionCallback(_ => { }, sc);
            op2.TryAddCompletionCallback(_ => tidActual = Thread.CurrentThread.ManagedThreadId, null);

            // Act
            await Task.Run(() => op.SetCompleted());

            await Task.Run(() => { tid = Thread.CurrentThread.ManagedThreadId; op2.SetCompleted(); });

            // Assert
            sc.Received(1).Post(Arg.Any <SendOrPostCallback>(), Arg.Any <object>());
            Assert.Equal(tid, tidActual);
        }