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

Ответы (0 шт):