小编Jam*_*Jam的帖子

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

辅助方法HandleException(Exception ex)和HandleInboundData(byte [] buffer,int length)将执行假定的任务。

与服务器的连接将是永久的,并且从服务器接收的数据的长度和频率将是未知的,其想法是将任务丢在那里,仅在数据可用时才接收和处理入站数据。

ReadClientAsync(TcpClient client)显然是失败的,因为如果没有可用数据,ReadAsync将始终返回0字节。

我应该如何使用异步/任务来编写ReadClientAsync来防止出现繁忙循环的情况?我以前在这些情况下使用BeginRead / EndRead,效果很好。在这种特殊情况下,这将是解决方案吗?

谢谢,

c# tcpclient beginread

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

beginread ×1

c# ×1

tcpclient ×1