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