コード例 #1
0
        public async Task AddCompletionCallback_IsThreadSafe(AsyncCreationOptions creationOptions)
        {
            // Arrange
            var op      = new AsyncCompletionSource(creationOptions);
            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.AddCompletionCallback(d);
                }
            }

            void TestMethod2()
            {
                for (var i = 0; i < 10000; ++i)
                {
                    op.RemoveCallback(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);
        }