public void MultipleProducersMultipleConsumersTest() { int producers = 10; int consumers = 10; int produceCount = 1000; var pq = new PriorityQueue <long>(); var consumed = new List <long> [consumers]; var consumersDoneEvt = new AutoResetEvent[consumers]; for (int i = 0; i < consumers; i++) { consumed[i] = new List <long>(); consumersDoneEvt[i] = new AutoResetEvent(false); int index = i; Task.Run(() => { try { while (true) { consumed[index].Add(pq.Take()); } } catch (InvalidOperationException) { } finally { consumersDoneEvt[index].Set(); } }); } var producersDoneEvt = new AutoResetEvent[producers]; for (int i = 0; i < producers; i++) { producersDoneEvt[i] = new AutoResetEvent(false); int index = i; Task.Run(() => { for (int j = 0; j < produceCount; j++) { pq.Add(j * (long)(index + 1)); } producersDoneEvt[index].Set(); }); } producersDoneEvt.ToList().ForEach(p => p.WaitOne()); pq.CompleteAdding(); consumersDoneEvt.ToList().ForEach(p => p.WaitOne()); Assert.AreEqual(produceCount * producers, consumed.SelectMany(l => l).ToList().Count); }
public void ActorMultipleAddTest() { Stopwatch sw = Stopwatch.StartNew(); Actor a = new Actor(); int posterCount = 30; long itterations = 100000; long i = 0; AutoResetEvent[] done = new AutoResetEvent[posterCount]; for (int k = 0; k < posterCount; k++) { int posterIndex = k; done[posterIndex] = new AutoResetEvent(false); Task.Run(() => { for (long j = 0; j < itterations; j++) { a.Post(() => { i++; }); } a.Post( () => { done[posterIndex].Set(); } ); }); } done.ToList().ForEach(p => p.WaitOne()); Assert.AreEqual(itterations * posterCount, i); a.Dispose(); sw.Stop(); long ms = sw.ElapsedMilliseconds; }