public void WorksWithReentrancy() { for (var i = 0; i < 25; i++) { var r = new DiscardRedundantWorkThrottle(); var h = new TaskCompletionSource(); Task t = null; r.SetNextToAction(() => t = r.SetNextToAsyncFunction(() => h.Task)).AssertRanToCompletion(); t.AssertNotCompleted(timeout: TimeSpan.FromMilliseconds(5)); h.SetRanToCompletion(); t.AssertRanToCompletion(); } }
public void SourceTransitions() { new TaskCompletionSource().Task.AssertNotCompleted(); var cex = new Exception[] { new InvalidEnumArgumentException(), new InvalidProgramException() }; var r1 = new TaskCompletionSource(); r1.SetRanToCompletion(); r1.Task.AssertRanToCompletion(); var r2 = new TaskCompletionSource(); r2.TrySetRanToCompletion().AssertIsTrue(); r2.Task.AssertRanToCompletion(); var r3 = new TaskCompletionSource(); r3.SetCanceled(); r3.Task.AssertCancelled(); var r4 = new TaskCompletionSource(); r4.TrySetCanceled().AssertIsTrue(); r4.Task.AssertCancelled(); var r5 = new TaskCompletionSource(); r5.SetException(new InvalidEnumArgumentException()); r5.Task.AssertFailed <InvalidEnumArgumentException>(); var r6 = new TaskCompletionSource(); r6.SetException(cex); r6.Task.AssertFailed <AggregateException>().InnerExceptions.AssertSequenceEquals(cex); var r7 = new TaskCompletionSource(); r7.TrySetException(new InvalidEnumArgumentException()).AssertIsTrue(); r7.Task.AssertFailed <InvalidEnumArgumentException>(); // failed transitions Util.ExpectException <InvalidOperationException>(r1.SetRanToCompletion); Util.ExpectException <InvalidOperationException>(r1.SetCanceled); Util.ExpectException <InvalidOperationException>(() => r1.SetException(new Exception())); Util.ExpectException <InvalidOperationException>(() => r1.SetException(cex)); r1.TrySetRanToCompletion().AssertIsFalse(); r1.TrySetCanceled().AssertIsFalse(); r1.TrySetException(new Exception()).AssertIsFalse(); r1.TrySetException(cex).AssertIsFalse(); }
public void EventuallySetFromTaskVoid() { var r1 = new TaskCompletionSource(); var r2 = new TaskCompletionSource(); var t3 = r1.EventuallySetFromTask(r2.Task); r1.Task.AssertNotCompleted(); t3.AssertNotCompleted(); r2.SetRanToCompletion(); t3.AssertRanToCompletion(); r1.Task.AssertRanToCompletion(); r1.EventuallySetFromTask(r2.Task).AssertFailed <InvalidOperationException>(); }
public void NoOverlap() { var r = new ExclusiveSynchronizationContext(); var n = 0; for (var i = 0; i < 1000; i++) { r.Post(z => { Assert.IsTrue(Interlocked.Increment(ref n) == 1); Assert.IsTrue(Interlocked.Decrement(ref n) == 0); }, null); } var a = new TaskCompletionSource(); r.Post(z => a.SetRanToCompletion(), null); a.Task.AssertRanToCompletion(); }
public void WaitsForAsyncAndCancels() { var r = new DiscardRedundantWorkThrottle(); var h = new TaskCompletionSource(); var t1 = r.SetNextToAsyncFunction(() => h.Task); var t2 = r.SetNextToAction(() => { }); new[] { t1, t2 }.WhenAny().AssertNotCompleted(); var t3 = r.SetNextToAction(() => { }); t2.AssertCancelled(); new[] { t1, t3 }.WhenAny().AssertNotCompleted(); h.SetRanToCompletion(); t1.AssertRanToCompletion(); t3.AssertRanToCompletion(); }
public void NoInterference() { var r = new ExclusiveSynchronizationContext(); var n = 0; var t = Task.WhenAll(Enumerable.Range(0, 5).Select(async e => await Task.Factory.StartNew(() => { for (var i = 0; i < 500; i++) { r.Post(z => { n += 1; }, null); } var a = new TaskCompletionSource(); r.Post(z => a.SetRanToCompletion(), null); a.Task.AssertRanToCompletion(); }))); t.AssertRanToCompletion(timeout: TimeSpan.FromSeconds(20)); // lots of work, long timeout Assert.IsTrue(n == 500 * 5); }