public Task DisconnectAsync()
        {
            try
            {
                _mitar.Stop();
                _workerController.CloseWorker(_syncWorker);
                Thread.Sleep(100);

                _mitar = null;
                _stream?.Close();
                _stream?.Dispose();
                _stream = null;
                _tcpClient?.Close();
                _tcpClient?.Dispose();
                _tcpClient = null;
                return(Task.CompletedTask);
            }
            catch (SocketException e)
            {
                IsConnected = false;
                throw new DeviceConnectionException("Ошибка отключения от кардиомонитора", e);
            }
            catch (ObjectDisposedException e)
            {
                IsConnected = false;
                throw new DeviceConnectionException("Ошибка отключения от кардиомонитора", e);
            }
            catch (Exception e)
            {
                IsConnected = false;
                throw new DeviceProcessingException("Ошибка отключения от кардиомонитора", e);
            }
        }
        public async Task ConnectAsync()
        {
            AssertInitParams();

            if (IsConnected)
            {
                throw new InvalidOperationException($"{GetType().Name} уже подключен к устройству");
            }

            try
            {
                // очистим перед подключением все накопленные ошибки
                while (_lastExceptions.TryDequeue(out _))
                {
                }

                var monitorIpAddress = await DiscoverMonitorIpAddressAsync()
                                       .ConfigureAwait(false);

                _tcpClient = new TcpClient();

                await _tcpClient.ConnectAsync(monitorIpAddress, _initParams.MonitorTcpPort)
                .ConfigureAwait(false);

                _stream = _tcpClient.GetStream();
                _mitar  = new MitarMonitorDataReceiver(_stream);
                _mitar.Start();
                // ReSharper disable once HeapView.CanAvoidClosure
                _syncWorker = _workerController.StartWorker(_initParams.UpdateDataPeriod, async() =>
                {
                    try
                    {
                        //todo сюды бы токен отмены
                        await UpdateDataAsync()
                        .ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        IsConnected = false;
                        _workerController.CloseWorker(_syncWorker);
                        _lastExceptions.Enqueue(ex);
                    }
                });
                IsConnected = true;
            }
            catch (SocketException e)
            {
                IsConnected = false;
                throw new DeviceConnectionException("Ошибка подключения к кардиомонитору", e);
            }
            catch (ObjectDisposedException e)
            {
                IsConnected = false;
                throw new DeviceConnectionException("Ошибка подключения к кардиомонитору", e);
            }
            catch (Exception e)
            {
                IsConnected = false;
                throw new DeviceProcessingException("Ошибка подключения к кардиомонитору", e);
            }
        }