Exemplo n.º 1
0
        public void SimpleLockThreadPoolQueueFromMultipleThreads()
        {
            var count         = 0;
            var queueCount    = 0;
            var pool          = new SimpleLockThreadPool();
            var queuePool     = new SimpleLockThreadPool();
            var callback      = new WaitCallback(obj => Interlocked.Increment(ref count));
            var queueCallback = new WaitCallback(obj =>
            {
                Interlocked.Increment(ref queueCount);
                pool.QueueUserWorkItem(callback);
            });

            for (var i = 0; i < 1000; i++)
            {
                queuePool.QueueUserWorkItem(queueCallback);
            }

            Thread.Sleep(TimeSpan.FromSeconds(2));

            queuePool.Dispose();
            Assert.AreEqual(1000, queueCount);

            Thread.Sleep(TimeSpan.FromSeconds(1));

            pool.Dispose();
            Assert.AreEqual(1000, count);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates a new instance of the ServerSession class.
        /// </summary>
        /// <param name="sessionID">Session ID.</param>
        /// <param name="timestamp">Session time stamp.</param>
        /// <param name="identity">Client identity.</param>
        /// <param name="sessionVariableAdapter">Adapter for accessing session variables.</param>
        internal ServerSession(Guid sessionID, DateTime timestamp, IIdentity identity, SessionVariableAdapter sessionVariableAdapter)
        {
            _timestamp = timestamp;
            _sessionID = sessionID;
            _identity  = identity;
            _sessionVariableAdapter = sessionVariableAdapter;

            // every server session has its own invocation queue
            // so that a disconnected client can't affect the other clients
            var threads       = ZyanSettings.EventQueueThreadCount;
            var highWatermark = ZyanSettings.EventQueueMaximumSize;

            _eventInvocationQueue = new SimpleLockThreadPool(threads, highWatermark)
            {
                WorkerThreadName = $"Events for session {sessionID}/{identity?.Name}",
            };
        }
Exemplo n.º 3
0
        public void SimpleLockThreadPoolWorkerThreadsAreNamed()
        {
            var pool = new SimpleLockThreadPool()
            {
                WorkerThreadName = "I'm not anonymous",
            };

            var count    = 0;
            var callback = new WaitCallback(obj =>
            {
                Assert.AreEqual(pool.WorkerThreadName, Thread.CurrentThread.Name);
                Interlocked.Increment(ref count);
            });

            for (var i = 0; i < 10; i++)
            {
                pool.QueueUserWorkItem(callback);
            }

            Thread.Sleep(TimeSpan.FromSeconds(0.1));
            pool.Dispose();
            Assert.AreEqual(10, count);
        }