You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一进程中多NamedPipeServerStream优化:取消Thread.Sleep实现即时响应

用异步等待替代NamedPipeServerStream的轮询机制

你当前的轮询方案存在延迟和CPU资源浪费的问题,完全可以通过Task.WhenAny实现无轮询的高效异步响应。以下是重构后的代码,核心思路是异步等待任意管道连接完成,处理后立即重启监听,全程无需Thread.Sleep。

重构后的完整代码

using System.IO;
using System.IO.Pipes;
using System.Threading.Tasks;

class PipeServer
{
    static async Task Main(string[] args)
    {
        var serverA = new NamedPipeServerStream("A", PipeDirection.InOut);
        var serverB = new NamedPipeServerStream("B", PipeDirection.InOut);

        // 启动两个管道的初始监听任务
        Task taskA = HandlePipeConnectionAsync(serverA);
        Task taskB = HandlePipeConnectionAsync(serverB);

        while (true)
        {
            // 等待任意一个管道连接完成,无轮询、无延迟
            var completedTask = await Task.WhenAny(taskA, taskB);
            
            if (completedTask == taskA)
            {
                // 管道A处理完成,重启监听任务
                taskA = HandlePipeConnectionAsync(serverA);
            }
            else if (completedTask == taskB)
            {
                // 管道B处理完成,重启监听任务
                taskB = HandlePipeConnectionAsync(serverB);
            }
        }
    }

    /// <summary>
    /// 封装单个管道的连接处理逻辑
    /// </summary>
    private static async Task HandlePipeConnectionAsync(NamedPipeServerStream server)
    {
        // 异步等待客户端连接
        await server.WaitForConnectionAsync();
        
        // 使用using确保流读写器自动释放资源
        using var reader = new StreamReader(server);
        using var writer = new StreamWriter(server);
        
        // 异步读取请求
        string? requestText = await reader.ReadLineAsync();
        
        // 这里编写你的请求处理逻辑
        // ...
        
        // 异步写入响应并刷新
        await writer.WriteLineAsync("My response");
        await writer.FlushAsync();
        
        // 断开当前连接,准备下一次监听
        server.Disconnect();
    }
}

关键改进点

  • 无轮询异步等待:通过await Task.WhenAny(taskA, taskB)监听两个管道的连接任务,任意任务完成后立即触发处理,完全消除轮询延迟和CPU空转。
  • 逻辑封装复用:将单个管道的连接、读写、断开逻辑封装为独立方法,代码更简洁,新增管道时只需添加对应监听任务即可。
  • 全程异步操作:使用ReadLineAsync、WriteLineAsync等异步IO方法,避免阻塞线程,充分利用系统IO完成端口提升效率。
  • 资源安全管理:用using块包裹StreamReader和StreamWriter,确保每次连接处理后资源正确释放。

内容的提问来源于stack exchange,提问作者Helena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:07:25