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); }