请原谅我缺乏关于任务和异步的知识。
使用 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 ex) 和 HandleInboundData(byte[] buffer, int length) 将执行假定的任务。
与服务器的连接将是永久的,并且从服务器接收的数据的长度和频率将未知,其想法是抛出一个任务,仅在数据可用时接收和处理入站数据。
ReadClientAsync(TcpClient client) 明显失败,因为如果没有可用数据,ReadAsync 将始终返回 0 字节。
我应该如何使用 async / task 编写 ReadClientAsync 以防止繁忙循环的情况?我以前在这些情况下使用过 BeginRead / EndRead,效果很好。在这种特殊情况下,这会是解决方案吗?
谢谢,