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); }
/// <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}", }; }
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); }