C# , tcp socket тайм-аут сброса посылки
Всем привет, реализовал тайм-аут сброса посылки, но хотел поинтересоваться у знающих людей, нормально сделал или как лучше данный вопрос реализовывать
public async Task<Dictionary<string, bool>> ReadRegistersFromTerminal(string imei, Socket client,int slaveId)
{
Dictionary<string, bool> resultReadRigisters = new Dictionary<string, bool>();
bool result = false;
Read = new byte[173];
string message = "Ассинхронный поток не выполнился , метод - ReadRegistersFromTerminal";
CancellationTokenSource token = new();
token.CancelAfter(new TimeSpan(0, 0, 21));
try
{
await Task.Run(async () =>
{
var readRegistersCommand = _commandsController.ReceiveCommandReadRegisters(slaveId); // подготовка массив байт, для отправки посылки на чтение регистров терминала
var readRegisters = _cRCTerminal.CRC16ModbussReadRegisters(ref readRegistersCommand); // считаем CRC и имеем готовый пакет для отправки
var commandFromContrillerReadIMEI76 = _commandWRXTerminal.ReadIMEIFromTerminal(); // подгтовка пакета по служебному каналу на чтение IMEI с модема
var crcr16ReadIMEIFromTerminal = _cRCTerminal.CRC16CCITT(commandFromContrillerReadIMEI76); // подсчитанный пает и готовый на отправку вместе с CRC
Read = await _commandsController.PollReadRegistersTerminalAsync(client, readRegisters,token.Token); // команда на чтение регистров с терминала
if (Read != null)
{
result = true;
resWrite = true;
message = $"Запрос на чтение регистров терминала выполнен успешно - {imei}!";
}
else
{
result = false;
resWrite = false;
message = $"Error read registers - {imei}!";
}
});
}
catch (OperationCanceledException ex)
{
LoggerApp.LoggerInformation.Error($"Время ожидания ответа от контроллера истекло {ex}");
}
finally
{
token.Dispose();
}
resultReadRigisters.Add(message, result);
return resultReadRigisters;
}
public async Task<byte[]> PollReadRegistersTerminalAsync(Socket networkStreamClient, byte[] commandFromController,CancellationToken token)
{
ArraySegment<byte> arraReadRegister = commandFromController;
Debug.WriteLine(token.IsCancellationRequested);
//byte[] read = new byte[173]; // IMEI
read = null;
int countHearBeather = 0;
try
{
Task resultTask = Task.Run(async () =>
{
// CancellationTokenSource token = new CancellationTokenSource();
while (countHearBeather != 3)
{
Stopwatch stopwatch = Stopwatch.StartNew();
Dictionary<int, ArraySegment<byte>> resultPoll = HearBetherAsync(networkStreamClient, commandFromController);
if (resultPoll is null)
{
LoggerApp.LoggerInformation.Error($"socket закрыт на подключение method PollReadRegistersTerminalAsync");
break;
}
else if (resultPoll.Keys.First() == -1)
{
countHearBeather++;
continue;
}
else if (resultPoll.Keys.First() == 1)
{
LoggerApp.LoggerInformation.Information($"Треминал ответил валидным порядком регитсров method PollReadRegistersTerminalAsync \n состояние countHearBeather = {countHearBeather}");
read = resultPoll.Values.First().ToArray();
break;
}
}
if (countHearBeather == 3)
LoggerApp.LoggerInformation.Error($"Жизенный цикл countHearBeather завершился method PollReadRegistersTerminalAsync , \n состояние countHearBeather = {countHearBeather}");
});
// Task<bool> resultTask = ReadRegistersAsync(networkStreamClient,commandFromController);
while (!token.IsCancellationRequested)
{
if (read != null)
{
if(resultTask.IsCompleted)
resultTask.Dispose();
break;
}
}
if(token.IsCancellationRequested)
token.ThrowIfCancellationRequested();
}
catch (OperationCanceledException ex)
{
LoggerApp.LoggerInformation.Error($"Время ожидания ответа от контроллера истекло {ex}");
read = null;
}
return read;
}