Exemplo n.º 1
0
        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) { }
        }
Exemplo n.º 2
0
 internal virtual void OnClientConnectionLost(EventArgs e) => ClientConnectionLost?.Invoke(this, e);