отправка данных tcp каждые 10 секунд — но на самом деле отправка каждые 20 секунд

#c#

#c#

Вопрос:

я написал более простой код, который отправляет данные массива байтов в некоторый сокет tcp. я делал это раньше много раз — но это по какой-то причине работает не так, как я ожидал.

Я вижу в журнале, что мой основной поток, который должен спать до 10 секунд, на самом деле спит 24 секунды перед отправкой следующего пакета

я не могу точно логически объяснить это. также попробуйте запустить основной цикл (и отправку) из другого потока … тот же результат

Код :

 public class Program
{
    static List<byte[]> _dataToSend = new List<byte[]>();
    static TcpClient _tcpClient = new TcpClient();


    static void Main(string[] args)
    {
        //
        //  init the TCP client => connect successful 

        //  add data to the _dataToSend 

        foreach (byte[] item in _dataToSend)
        {

            _tcpClient.Client.Send(item);

            Thread.Sleep(10000);       // 10 second
        }
    }
}
  

Комментарии:

1. Вы спите в течение 10 секунд после отправки элемента. Сколько времени занимает отправка элемента?

2. Да. Я бы начал изучать асинхронность здесь (тратя поток на спящий режим 10 секунд — ой). Тогда вы могли бы в принципе отправить данные, подождать, а затем ожидать, чтобы увидеть, как была завершена последняя отправка.

3. отправка занимает 10-20 миллисекунд

4. я не хочу использовать в этом случае асинхронный

Ответ №1:

Попробуйте отключить задержку на TcpClient :

 _tcpClient.NoDelay = true;
  

Ответ №2:

Как говорили другие, отправка данных может занять некоторое дополнительное время. Итак, что вы могли бы сделать, это рассчитать оставшийся промежуток времени, который вам нужно дождаться.

Попробуйте что-то вроде этого:

 var sw = new Stopwatch();

foreach (byte[] item in _dataToSend)
{
    sw.Restart();

    _tcpClient.Client.Send(item);

    int remainingMilliseconds = (int)(10000 - sw.ElapsedMilliseconds);
    if (remainingMilliseconds > 0) Thread.Sleep(remainingMilliseconds);
}
  

Таким образом, если отправка занимает, например, 5 секунд, вы ждете только 5 дополнительных секунд. Если отправка занимает более 10 секунд, вы вообще не ждете.