예제 #1
0
        public void EnqueueDequeueStop()
        {
            WorkingThread <object> aWorkingThread = new WorkingThread <object>();

            AutoResetEvent  aQueueCompleted     = new AutoResetEvent(false);
            List <string>   aReceivedMessages   = new List <string>();
            Action <object> aProcessingCallback = x =>
            {
                aReceivedMessages.Add((string)x);

                if (aReceivedMessages.Count == 3)
                {
                    aQueueCompleted.Set();
                }
            };

            aWorkingThread.RegisterMessageHandler(aProcessingCallback);

            aWorkingThread.EnqueueMessage("Message1");
            aWorkingThread.EnqueueMessage("Message2");
            aWorkingThread.EnqueueMessage("Message3");

            aQueueCompleted.WaitOne();

            aWorkingThread.UnregisterMessageHandler();

            Assert.AreEqual("Message1", aReceivedMessages[0]);
            Assert.AreEqual("Message2", aReceivedMessages[1]);
            Assert.AreEqual("Message3", aReceivedMessages[2]);
        }
예제 #2
0
        public void EnqueueDequeueStop_1000000()
        {
            WorkingThread <object> aWorkingThread = new WorkingThread <object>();

            AutoResetEvent  aQueueCompleted     = new AutoResetEvent(false);
            List <string>   aReceivedMessages   = new List <string>();
            Action <object> aProcessingCallback = x =>
            {
                aReceivedMessages.Add((string)x);

                if (aReceivedMessages.Count == 1000000)
                {
                    aQueueCompleted.Set();
                }
            };

            aWorkingThread.RegisterMessageHandler(aProcessingCallback);

            Stopwatch aStopWatch = new Stopwatch();

            aStopWatch.Start();

            for (int i = 0; i < 1000000; ++i)
            {
                aWorkingThread.EnqueueMessage("a");
            }

            aQueueCompleted.WaitOne();

            aStopWatch.Stop();
            Console.WriteLine("Elapsed time: {0}", aStopWatch.Elapsed);

            aWorkingThread.UnregisterMessageHandler();
        }
예제 #3
0
        public void SendMessage(string receiverId, object message)
        {
            using (EneterTrace.Entering())
            {
                // Get the thread handling the input channel.
                WorkingThread <object> aWorkingThread = null;

                using (ThreadLock.Lock(myRegisteredMessageHandlers))
                {
                    myRegisteredMessageHandlers.TryGetValue(receiverId, out aWorkingThread);
                }

                if (aWorkingThread != null)
                {
                    aWorkingThread.EnqueueMessage(message);
                }
                else
                {
                    string anError = "The receiver '" + receiverId + "' does not exist.";
                    EneterTrace.Error(anError);
                    throw new InvalidOperationException(anError);
                }
            }
        }