private void SenderThread() { try { while (IsRunning) { if (paused) { Thread.Sleep(PauseIdleTime); } try { bool moreWork = false; for (int i = 0; i < connections.Count; i++) { if (connections[i].CallbackThread != null && connections[i].CanStartNewThread) { //try { connections[i].CallbackThread = null; lock (activeThreadsLock) { activeThreads--; } //} //catch (Exception e) { } } if (connections[i].IsMarkedForRemoval) { if (connections[i].CanStartNewThread) { lock (connections) { connections[i].ForceDisconnect(); if (connections[i].CallbackThread != null) { activeThreads--; } connections.RemoveAt(i); i--; } } } else if (connections[i].CallbackThread != null) { } else if (connections[i].IsConnected && (connections[i].LastVerifyTime.AddMilliseconds(VerifyConnectionInterval) > DateTime.UtcNow || connections[i].VerifyConnection())) { moreWork = moreWork || ProcessConnection(connections[i]); } else if (ClientConnectionLost != null) { if (/*activeThreads < MaxCallbackThreads && */ connections[i].CanStartNewThread) { /*lock (activeThreadsLock) { * activeThreads++; * }*/ ServerConnection connection = connections[i]; //connections[i].CallbackThread = new Thread(() => { ClientConnectionLost?.Invoke(this, connection); //}); //connections[i].CallbackThread.Start(); connections[i].IsMarkedForRemoval = true; Thread.Yield(); } } else { connections[i].IsMarkedForRemoval = true; lock (connections) { if (connections[i].CallbackThread != null) { activeThreads--; } connections[i].ForceDisconnect(); connections.RemoveAt(i); i--; } } } if (!moreWork) { Thread.Yield(); lock (sem) { foreach (ServerConnection connection in connections) { if (connection.HasMoreWork) { moreWork = true; break; } } } if (!moreWork) { waiting = true; sem.Wait(IdleTime); waiting = false; } } } catch (SocketException ex) { if (IsRunning) { Error?.Invoke(this, ex); } } Thread.Sleep(precision ? 1 : IdleTime); } } catch (ThreadAbortException) { } catch (ThreadInterruptedException) { } }
internal virtual void OnClientConnectionLost(EventArgs e) => ClientConnectionLost?.Invoke(this, e);