Esempio n. 1
0
        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;
        }