Пример #1
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);
        }