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(); } }); }); }