예제 #1
0
        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();
        }