同一进程中的多个NamedPipeServerStreams

问题描述 投票:0回答:1

我已经实现了一个流程的第一个实现,该流程保持两个不同的

NamedPipeServerStream
运行并在两者上接收消息。我想知道是否有一种方法可以在任务完成时直接对其做出反应,而不是在这种情况下使用
Thread.Sleep
。下面的代码工作正常,我只是觉得它可以更有效,对任务完成时做出反应,而不是按时间间隔进行轮询,但我不知道如何实现。

static void Main(string[] args)
{
    var serverA = new NamedPipeServerStream("A", PipeDirection.InOut);
    var readerA = new StreamReader(serverA);
    var writerA = new StreamWriter(serverA);
    var serverB = new NamedPipeServerStream("B", PipeDirection.InOut);
    var readerB = new StreamReader(serverB);
    var writerB = new StreamWriter(serverB);

    Task taskA = serverA.WaitForConnectionAsync();
    Task taskB = serverB.WaitForConnectionAsynC();

    while(true)
    {
        if (taskA.IsCompleted)
        {
            string? requestText = readerA.ReadLine(); // Read a request
            ... // Handle request
            writerA.WriteLine("My response"); // Write a response
            writerA.Flush();
            serverA.Disconnect(); // Disconnect the current pipe
            taskA = serverA.WaitForConnectionAsync(); // Restart taskA to listen for more requests
        }
        else if (taskB.IsCompleted)
        {
            string? requestText = readerB.ReadLine(); // Read a request
            ... // Handle request
            writerB.WriteLine("My response"); // Write a response
            writerB.Flush();
            serverB.Disconnect(); // Disconnect the current pipe
            taskB = serverB.WaitForConnectionAsync(); // Restart taskB to listen for more requests
        }
        else
        {
            Thread.Sleep(100); // 100 milliseconds is actually quite a long time, too long, but I also don't want to waste CPU cycles by polling too frequently.
        }
    }

}
c# .net named-pipes
1个回答
0
投票

我找到了 Task.WaitAny,我现在使用它而不是 Thread.Sleep,以便在任务完成时立即做出反应。

else
{
    Task.WaitAny(taskA, taskB); // Wait for either task to complete
}
© www.soinside.com 2019 - 2024. All rights reserved.