Прошу прощения за недостаток знаний о задачах и Async.TcpClient; NetworkStream; ReadAsync; C#
Использование класса TcpClient я создаю связь с доступным сервером:
void async RunClientAsync()
{
TcpClient client = new TcpClient();
try
{
await client.ConnectAsync(IPAddress.Parse("1.1.1.1"), 8889);
Task.Start(() => ReadClientAsync(client));
}
catch (Exception ex)
{
HandleException(ex);
}
}
// -----
void async ReadClientAsync(TcpClient client)
{
byte[] bf = new byte[2048];
try
{
while(true)
{
int br = await client.NetworkStream().ReadAsync();
if (br > 0)
{
HandleInboundData(bf, br);
}
}
}
catch (Exception ex)
{
HandleException(ex);
}
}
хелперной метода HandleException (Exception ех) и HandleInboundData (байты [] буфер, внутр длиной) будут выполнять взятую на себя задачу.
Соединение с сервером будет неограниченно, и данные, полученные с сервера, будут иметь неизвестную длину и частоту, идея состоит в том, чтобы бросить туда задачу, которая принимает и обрабатывает входящие данные только тогда, когда доступны данные.
ReadClientAsync (клиент TcpClient) является очевидным сбоем, поскольку ReadAsync всегда будет возвращать 0 байтов, если данных нет.
Как подойти к написанию ReadClientAsync с помощью async/task, чтобы предотвратить ситуацию с занятой петлей? Раньше я использовал BeginRead/EndRead, который работал нормально. Будет ли это решение в этом конкретном случае?
Спасибо,
Благодарим вас за комментарий. Это из записи MSDN для ReadAsync: «Задача, представляющая операцию асинхронного чтения.Значение параметра TResult содержит общее количество байтов, считанных в буфере. Значение результата может быть меньше количества запрошенных байтов, если количество доступных в настоящее время байтов меньше запрошенного числа, или оно может быть 0 (ноль), если конец потока достигнут. «Я понял конец потока чтобы не было данных в потоке для чтения. – Jam
Понял. Спасибо, Луаан. По-моему, я понимаю, в чем проблема. – Jam