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?
没有 CancellationTokenSource 的新 CancellationToken() 和 IsCancellationRequested