コード例 #1
0
            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);
                }
            }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
 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);
 }
コード例 #4
0
        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;
        }