CancellationToken无法与WaitForConnectionAsync一起使用

时间:2018-12-09 18:32:38

标签: c# asynchronous named-pipes

NamedPipeServerStream server=new NamedPipeServerStream("aaqq");
var ct=new CancellationTokenSource();
ct.CancelAfter(1000);
server.WaitForConnectionAsync(ct.Token).Wait();

我希望最后一行在一秒钟后抛出OperationCanceledException,但它将永远挂起。为什么?

1 个答案:

答案 0 :(得分:3)

仅当您使用异步命名管道时才检查取消令牌,这不是默认值(是的,API的设计确实很差)。要使其异步,您必须在PipeOptions中提供正确的值:

NamedPipeServerStream server = new NamedPipeServerStream("aaqq", PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
var ct = new CancellationTokenSource();
ct.CancelAfter(1000);
server.WaitForConnectionAsync(ct.Token).Wait();

然后取消令牌将按预期工作。