public ExampleClass() { _criticalMethod = new MostRecentAsyncActor <CriticalParams>(cp => { Console.WriteLine(cp.Key + " = " + cp.Value); }); }
public async Task TestRobustness() { var rand = new Random(42); int lastAction = -1, lastAction2 = 42; Action <int, CancellationToken> t = (r, tok) => { lastAction = r; Task.Delay(rand.Next(100)).Wait(); }; var queue = new MostRecentAsyncActor <int>(t); for (var i = 0; i < 1000; i++) { var r = rand.Next(); lastAction2 = r; var task = queue.Push(r); if (i == 999) { await task; } else { await Task.Delay(rand.Next(150)); } } Assert.Equal(lastAction, lastAction2); }
public async Task TestMostRecentSubAdd() { // queue some tasks that take 200ms 100ms apart var hits = new bool[10]; Action <int, CancellationToken> t = (r, tok) => { if (!tok.IsCancellationRequested) { hits[r] = true; Task.Delay(100).Wait(); } }; var queue = new MostRecentAsyncActor <int>(t); Task last = null; for (var i = 0; i < hits.Length; i++) { last = queue.Push(i); await Task.Delay(45); } if (last != null) { await last; } Assert.True(hits.Last()); }
public async Task TestMiddleSkipped() { var hits = new bool[3]; Action <int, CancellationToken> t = (i, tok) => { hits[i] = true; Task.Delay(20).Wait(); }; var queue = new MostRecentAsyncActor <int>(t); var t1 = queue.Push(0); var t2 = queue.Push(1); await queue.Push(2); Assert.True(t1.IsCompleted); Assert.True(t2.IsCompleted); // the hitFirst value is arbitrary (based on timing) and not particularly related to the goal Assert.False(hits[1]); Assert.True(hits[2]); }