以下是一个简单的示例代码,实现了 TCP 客户端异步读取数据的功能:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public class TcpClientAsync
{
    private const int Timeout = 5000; // 超时时间,单位毫秒
    private readonly TcpClient _client;
    private readonly NetworkStream _stream;

    public TcpClientAsync(string host, int port)
    {
        _client = new TcpClient();
        _client.Connect(host, port);
        _stream = _client.GetStream();
    }

    public async Task<string> ReadAsync()
    {
        var buffer = new byte[1024]; // 读取缓冲区
        var result = await _stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
        if (result > 0)
        {
            return Encoding.UTF8.GetString(buffer, 0, result);
        }
        else
        {
            // 没有数据立即返回空字符串
            return string.Empty;
        }
    }

    public async Task<string> ReadWithTimeoutAsync()
    {
        var readTask = ReadAsync();
        var timeoutTask = Task.Delay(Timeout);
        var completedTask = await Task.WhenAny(readTask, timeoutTask).ConfigureAwait(false);
        if (completedTask == readTask)
        {
            // 有数据立即返回结果
            return await readTask.ConfigureAwait(false);
        }
        else
        {
            // 超时返回空字符串
            return string.Empty;
        }
    }

    public void Close()
    {
        _client.Close();
    }
}

使用示例:

var client = new TcpClientAsync('127.0.0.1', 1234);
var result = await client.ReadWithTimeoutAsync();
client.Close();

在调用ReadWithTimeoutAsync方法时,会同时启动一个异步读取任务和一个超时任务。如果有数据到达,读取任务会立即返回结果;如果超时时间到达,超时任务会返回空字符串。注意,需要在读取完数据后调用Close方法关闭 TCP 连接。

C# TCP 客户端异步读取数据:实时返回结果并处理超时

原文地址: https://www.cveoy.top/t/topic/on0B 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录