public async Task ProcessAsync(IExchangeDataProviderBase dataProvider, CancellationToken token) { //Ожидание получение информации из потока var actionBuffer = await ReadFromStreamAsync(dataProvider.CountSetDataByte, token); byte[] writeBuffer = null; if (dataProvider.IsSynchronized) { lock (dataProvider.SyncRoot) { if (dataProvider.SetDataByte(actionBuffer))//если полученные от клиента данные валидны, то отправим ему ответ { writeBuffer = dataProvider.GetDataByte(); } } } else { if (dataProvider.SetDataByte(actionBuffer))//если полученные от клиента данные валидны, то отправим ему ответ { writeBuffer = dataProvider.GetDataByte(); } } //Отправка ответа в поток if (writeBuffer != null) { await WriteInStreamAsync(writeBuffer, token); } }
/// <summary> /// Функция обмена по порту. Запрос-ожидание-ответ. /// Возвращает true если результат обмена успешен. /// </summary> public async Task <bool> DataExchangeAsync(int timeRespoune, IExchangeDataProviderBase dataProvider, CancellationToken ct) { if (!IsConnect) { return(false); } if (dataProvider == null) { return(false); } IsRunDataExchange = true; try { byte[] writeBuffer = dataProvider.GetDataByte(); if (writeBuffer != null && writeBuffer.Any()) { var readBuff = await RequestAndRespawnInstantlyAsync(writeBuffer, dataProvider.CountSetDataByte, timeRespoune, ct); dataProvider.SetDataByte(readBuff); } } catch (OperationCanceledException) { return(false); } catch (TimeoutException) { //ReOpen(); return(false); } IsRunDataExchange = false; return(true); }
public async Task ProcessAsync(IExchangeDataProviderBase dataProvider, CancellationToken token) { await Task.Run(async() => { var actionBuffer = await ReadFromStreamAsync(dataProvider.CountSetDataByte, token); if (dataProvider.SetDataByte(actionBuffer))//если полученные от клиента данные валидны, то отправим ему ответ { await WriteInStreamAsync(dataProvider.GetDataByte(), token); } }, token); }
public async Task RequestAndRespoune(IExchangeDataProviderBase dataProvider) { if (!IsConnect) { return; } if (dataProvider == null) { return; } IsRunDataExchange = true; if (await SendData(dataProvider)) { try { var data = await TakeData(dataProvider.CountSetDataByte, _timeRespoune, CancellationToken.None); dataProvider.SetDataByte(data); _countTryingTakeData = 0; } catch (OperationCanceledException) { StatusString = "операция прерванна"; if (++_countTryingTakeData > _numberTryingTakeData) { await ReConnect(); } } catch (TimeoutException) { StatusString = "Время на ожидание ответа вышло"; if (++_countTryingTakeData > _numberTryingTakeData) { await ReConnect(); } } catch (IOException) { await ReConnect(); } } else //не смогли отрпавить данные. СРАЗУ ЖЕ переподключение { await ReConnect(); } IsRunDataExchange = false; }