#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 секунд, вы вообще не ждете.