У меня есть следующий код для чтения байтов из потока TCP (я удалил проверку ошибок):
/// <summary>Awaitable. Reads a certain amount of bytes from a network stream. Returns false
/// on error</summary>
async Task<bool> readBytes (NetworkStream stream, byte []buffer, int totalBytes)
{
int bytesRead = 0;
while (true)
{
var br = await stream.ReadAsync (buffer, bytesRead, totalBytes - bytesRead);
if (br == 0) return false; // closed stream
bytesRead += br;
if (bytesRead >= totalBytes) return true;
}
}
Затем я использую его внешне, чтобы получить 4 байта с длиной поступающих данных,и массив данных (псевдокод, я удалил проверку ошибок и распределение, просто чтобы дать представление):
success = await readBytes(stream, header, 4);
success = await readBytes(stream, data, dataLength);
presentDataToApp(data, dataLength);
Клиент / сервер должен взаимодействовать почти в реальном времени (это игра, где клиентское приложениерегулирует несколько параметров, например, свет).Например, клиент имеет ползунок WinForms и передает все изменения в серверное приложение.При перемещении этого ползунка может быть много обновлений в одну секунду (из моих журналов он отправляет данные примерно 100 раз в секунду).
Этот код работает хорошо и в режиме реального времени, пока сервер (который запускает код, который я вставил) запускается через Visual Studio.Однако, когда я запускаю серверное приложение без Visual Studio (или использую Ctrl + F5 ), связь начинает сильно отставать.
Чтобы отменить проблему асинхронности / ожидания,Я клонировал класс comms и запустил его через Thread, удалив все функции async / await.Теперь код выполняется в реальном времени как в Visual Studio, так и в автономном режиме (поэтому это проблема, связанная с async / await).
Почему в этом случае асинхронное / ожидание задерживает связь?(там, безусловно, много ждет в секунду).Что определяет количество времени ожидания после ожидания, когда данные не готовы?(Я предполагал, что это было разрешение таймера, но в моей системе оно составляет 1 мс, независимо от того, как я запускаю приложение сервера).