我已经实现了一个流程的第一个实现,该流程保持两个不同的
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.
}
}
}
我找到了 Task.WaitAny,我现在使用它而不是 Thread.Sleep,以便在任务完成时立即做出反应。
else
{
Task.WaitAny(taskA, taskB); // Wait for either task to complete
}