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]); }
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(); }
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); } } }