CancellationToken 不适用于 WaitForConnectionAsync

Posted

技术标签:

【中文标题】CancellationToken 不适用于 WaitForConnectionAsync【英文标题】:CancellationToken not working with WaitForConnectionAsync 【发布时间】:2018-12-09 18:32:38 【问题描述】:
NamedPipeServerStream server=new NamedPipeServerStream("aaqq");
var ct=new CancellationTokenSource();
ct.CancelAfter(1000);
server.WaitForConnectionAsync(ct.Token).Wait();

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

【问题讨论】:

你能检查你的 NamedPipeServerStream 的IsAsync 属性的值吗? 【参考方案1】:

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

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

【讨论】:

附带说明:同样需要手动启用异步性的文件流(与管道流共享 I/O WinAPI 调用)也是如此。 默认行为是静默挂起似乎很疯狂。如果流不是异步的,也许XAsync 方法应该抛出。

以上是关于CancellationToken 不适用于 WaitForConnectionAsync的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Windows START 命令不适用于参数和路径中的空格?

Index.php 有效,而 Index.html 不适用于 WAMP 上的本地主机

我应该如何使用 DataflowBlockOptions.CancellationToken?

如何取消 CancellationToken

没有 CancellationTokenSource 的新 CancellationToken() 和 IsCancellationRequested

我应该何时调用 CancellationToken.ThrowIfCancellationRequested?