请原谅我对任务和异步的认识不足。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(异常前)和HandleInboundData(字节[]缓冲液,INT长度)将执行假定任务。
与服务器的连接将是永久和从服务器接收到的数据将是未知的长度和频率的,其想法是抛出一个任务在那里,接收和处理,只有当数据是可用的入站数据。
ReadClientAsync(TcpClient客户端)明显失败,因为如果没有可用数据,ReadAsync将始终返回0字节。
我应该如何使用async/task编写ReadClientAsync以防止繁忙循环情况?在这些情况之前,我已经使用了BeginRead/EndRead,它工作正常。这是否是这种特殊情况下的解决方案?
谢谢,
谢谢你的评论。这是来自ReadAsync的MSDN条目:“表示异步读取操作的任务。TResult参数的值包含读入缓冲区的总字节数。如果当前可用的字节数小于请求的数字,结果值可能会小于请求的字节数,如果已到达流的末尾,结果值可能为0(零)。“我理解了流的结束意味着流中没有数据要读取。 – Jam
了解。谢谢Luaan。我相信我明白问题出在哪里。 – Jam