private void RunCommandsLoop() { _messageThread = new Thread(() => { _serverStopped = false; while (!_serverStopped) { try { var data = _protocolChannel.Read <TMessage>(); var eventData = new CommunicationEventArgs { Data = data, Channel = _protocolChannel, }; DataReceived?.Invoke(this, eventData); } catch (ChannelException e) { var eventData = new CommunicationEventArgs { Data = null, Channel = _protocolChannel, Exception = e }; try { DataReceived?.Invoke(this, eventData); } catch { // один из обработчиков выбросил исключение // мы все равно не знаем что с ним делать. // Считаем, что факап подписчика - его проблемы. } // свойство в исключении может быть утановлено в обработчике евента _serverStopped = e.StopChannel; } catch (Exception) { _serverStopped = true; } } }); _messageThread.Start(); }