CancellationToken 不适用于 WaitForConnectionAsync

wez*_*ten 5 c# asynchronous named-pipes

NamedPipeServerStream server=new NamedPipeServerStream("aaqq");
var ct=new CancellationTokenSource();
ct.CancelAfter(1000);
server.WaitForConnectionAsync(ct.Token).Wait();
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*sse 10

仅当您使用异步命名管道时才会检查取消令牌,这不是默认值(是的,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();
Run Code Online (Sandbox Code Playgroud)

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

  • 默认行为是静默挂起似乎很疯狂。如果流不是异步的,那么可能 `XAsync` 方法应该抛出。 (2认同)