Exemplo n.º 1
0
        public void TestRemoteListenMultithreaded()
        {
            const int threadCnt  = 20;
            const int runSeconds = 20;

            var messaging = _grid1.GetMessaging();

            var senders = Task.Factory.StartNew(() => TestUtils.RunMultiThreaded(() =>
            {
                MessagingTestHelper.ClearReceived(int.MaxValue);
                messaging.Send(NextMessage());
                Thread.Sleep(50);
            }, threadCnt, runSeconds));


            var sharedListener = MessagingTestHelper.GetListener();

            for (int i = 0; i < 100; i++)
            {
                messaging.RemoteListen(sharedListener);  // add some listeners to be stopped by filter result
            }
            TestUtils.RunMultiThreaded(() =>
            {
                // Check that listen/stop work concurrently
                messaging.StopRemoteListen(messaging.RemoteListen(sharedListener));
            }, threadCnt, runSeconds / 2);

            MessagingTestHelper.ListenResult = false;

            messaging.Send(NextMessage());                  // send a message to make filters return false

            Thread.Sleep(MessagingTestHelper.SleepTimeout); // wait for all to unsubscribe

            MessagingTestHelper.ListenResult = true;

            senders.Wait(); // wait for senders to stop

            MessagingTestHelper.ClearReceived(int.MaxValue);

            var lastMsg = NextMessage();

            messaging.Send(lastMsg);

            Thread.Sleep(MessagingTestHelper.SleepTimeout);

            // Check that unsubscription worked properly
            var sharedResult = MessagingTestHelper.ReceivedMessages.ToArray();

            if (sharedResult.Length != 0)
            {
                Assert.Fail("Unexpected messages ({0}): {1}; last sent message: {2}", sharedResult.Length,
                            string.Join(",", sharedResult), lastMsg);
            }
        }
Exemplo n.º 2
0
        public void TestRemoteListenMultithreaded()
        {
            const int threadCnt  = 20;
            const int runSeconds = 20;

            var messaging = _grid1.GetMessaging();

            var senders = Task.Factory.StartNew(() => TestUtils.RunMultiThreaded(() =>
            {
                MessagingTestHelper.ClearReceived(int.MaxValue);
                messaging.Send(NextMessage());
                Thread.Sleep(50);
            }, threadCnt, runSeconds));


            var sharedListener = MessagingTestHelper.GetListener();

            for (int i = 0; i < 100; i++)
            {
                messaging.RemoteListen(sharedListener);  // add some listeners to be stopped by filter result
            }
            TestUtils.RunMultiThreaded(() =>
            {
                // Check that listen/stop work concurrently
                messaging.StopRemoteListen(messaging.RemoteListen(sharedListener));
            }, threadCnt, runSeconds);

            MessagingTestHelper.ListenResult = false;

            messaging.Send(NextMessage());                    // send a message to make filters return false

            Thread.Sleep(MessagingTestHelper.MessageTimeout); // wait for all to unsubscribe

            MessagingTestHelper.ListenResult = true;

            senders.Wait(); // wait for senders to stop

            var sharedResult = MessagingTestHelper.ReceivedMessages.Count;

            messaging.Send(NextMessage());

            Thread.Sleep(MessagingTestHelper.MessageTimeout);

            // Check that unsubscription worked properly
            Assert.AreEqual(sharedResult, MessagingTestHelper.ReceivedMessages.Count);
        }
Exemplo n.º 3
0
        public void TestLocalListenMultithreaded()
        {
            const int threadCnt  = 20;
            const int runSeconds = 20;

            var messaging = _grid1.GetMessaging();

            var senders = Task.Factory.StartNew(() => TestUtils.RunMultiThreaded(() =>
            {
                messaging.Send(NextMessage());
                Thread.Sleep(50);
            }, threadCnt, runSeconds));


            var sharedReceived = 0;

            var sharedListener = new MessageListener <string>((id, x) =>
            {
                Interlocked.Increment(ref sharedReceived);
                Thread.MemoryBarrier();
                return(true);
            });

            TestUtils.RunMultiThreaded(() =>
            {
                // Check that listen/stop work concurrently
                messaging.LocalListen(sharedListener);

                for (int i = 0; i < 100; i++)
                {
                    messaging.LocalListen(sharedListener);
                    messaging.StopLocalListen(sharedListener);
                }

                var localReceived = 0;
                var stopLocal     = 0;

                var localListener = new MessageListener <string>((id, x) =>
                {
                    Interlocked.Increment(ref localReceived);
                    Thread.MemoryBarrier();
                    return(Thread.VolatileRead(ref stopLocal) == 0);
                });

                messaging.LocalListen(localListener);

                Thread.Sleep(100);

                Thread.VolatileWrite(ref stopLocal, 1);

                Thread.Sleep(1000);

                var result = Thread.VolatileRead(ref localReceived);

                Thread.Sleep(100);

                // Check that unsubscription worked properly
                Assert.AreEqual(result, Thread.VolatileRead(ref localReceived));

                messaging.StopLocalListen(sharedListener);
            }, threadCnt, runSeconds);

            senders.Wait();

            Thread.Sleep(100);

            var sharedResult = Thread.VolatileRead(ref sharedReceived);

            messaging.Send(NextMessage());

            Thread.Sleep(MessagingTestHelper.SleepTimeout);

            // Check that unsubscription worked properly
            Assert.AreEqual(sharedResult, Thread.VolatileRead(ref sharedReceived));
        }