public void A16_RequestResponse_100_ConstantlyInterrupted() { IDuplexOutputChannel aDuplexOutputChannel = MessagingSystem.CreateDuplexOutputChannel(ChannelId); IDuplexInputChannel aDuplexInputChannel = MessagingSystem.CreateDuplexInputChannel(ChannelId); IDuplexInputChannel anUnderlyingDuplexInputChannel = aDuplexInputChannel.GetField <IDuplexInputChannel>("myInputChannel"); Assert.NotNull(anUnderlyingDuplexInputChannel); AutoResetEvent anAllMessagesProcessedEvent = new AutoResetEvent(false); // Received messages. List <int> aReceivedMessages = new List <int>(); aDuplexInputChannel.MessageReceived += (x, y) => { lock (aReceivedMessages) { string aReceivedMessage = y.Message as string; EneterTrace.Info("Received message: " + aReceivedMessage); int k = int.Parse(aReceivedMessage); aReceivedMessages.Add(k); k += 1000; EneterTrace.Info("Sent response message: " + k.ToString()); aDuplexInputChannel.SendResponseMessage(y.ResponseReceiverId, k.ToString()); } }; aDuplexOutputChannel.ConnectionClosed += (x, y) => { EneterTrace.Info("ConnectionClosed invoked in duplex output channel"); // The buffered duplex output channel exceeded the max offline time. anAllMessagesProcessedEvent.Set(); }; // Received response messages. List <int> aReceivedResponseMessages = new List <int>(); aDuplexOutputChannel.ResponseMessageReceived += (x, y) => { lock (aReceivedResponseMessages) { string aReceivedMessage = y.Message as string; EneterTrace.Info("Received response message: " + aReceivedMessage); int k = int.Parse(aReceivedMessage); aReceivedResponseMessages.Add(k); if (aReceivedResponseMessages.Count == 100) { anAllMessagesProcessedEvent.Set(); } } }; try { bool aTestFinishedFlag = false; aDuplexInputChannel.StartListening(); aDuplexOutputChannel.OpenConnection(); Thread anInteruptingThread = new Thread(() => { for (int i = 0; i < 100 && !aTestFinishedFlag; ++i) { anUnderlyingDuplexInputChannel.DisconnectResponseReceiver(aDuplexOutputChannel.ResponseReceiverId); Thread.Sleep(ConnectionInterruptionFrequency); } }); // Start constant disconnecting. anInteruptingThread.Start(); for (int i = 0; i < 100; ++i) { aDuplexOutputChannel.SendMessage(i.ToString()); } // Wait until all messages are processed. //anAllMessagesProcessedEvent.WaitOne(); Assert.IsTrue(anAllMessagesProcessedEvent.WaitOne(20000), "The timeout occured."); aTestFinishedFlag = true; anInteruptingThread.Join(); } finally { aDuplexOutputChannel.CloseConnection(); aDuplexInputChannel.StopListening(); } aReceivedMessages.Sort(); Assert.AreEqual(100, aReceivedMessages.Count); for (int i = 0; i < 100; ++i) { Assert.AreEqual(i, aReceivedMessages[i]); } aReceivedResponseMessages.Sort(); Assert.AreEqual(100, aReceivedResponseMessages.Count); for (int i = 0; i < 100; ++i) { Assert.AreEqual(i + 1000, aReceivedResponseMessages[i]); } }