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