Example #1
0
        public void Stop(int timeoutMs = Timeout.Infinite)
        {
            if (!_listener.IsListening)
            {
                return;
            }

            if (timeoutMs != Timeout.Infinite && timeoutMs <= 0)
            {
                throw new ArgumentException();
            }

            // Останавливаем прослушивание порта
            _listener.Stop();

            // Ждем завершения потока этот вызов блокирует поток и ждет указанное время или
            // пока поток _thread не завершится
            _thread.Join(timeoutMs);

            // если поток не завершен через указанное время, то, возможно, он заблокирован
            // GetContext -- блокирующий вызов и нам надо остановить его принудительно.
            if (_thread.IsAlive)
            {
                _thread.Abort();
            }

            // Ждем завершения потоков обработки, мы хотим чтобы они завершились нормально.
            // Для этого блокируем очередь.
            _lock.Execute(() =>
            {
                _handleThreads.ForEach(t =>
                {
                    // Также ждем завершения всех потоков
                    // И, если надо, останавливаем их принудительно.
                    t.Join(timeoutMs);
                    if (t.IsAlive)
                    {
                        t.Abort();
                    }
                });
            });
        }