请原谅我对任务和异步操作的知识不足。
使用TcpClient类,我正在与一个可用服务器建立连接:
使用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,效果很好。在这种特殊情况下,那是否是解决方案?
谢谢。