代码之家  ›  专栏  ›  技术社区  ›  wezten

CancellationToken不与WaitForConnectionAsync一起工作

  •  2
  • wezten  · 技术社区  · 6 年前
    NamedPipeServerStream server=new NamedPipeServerStream("aaqq");
    var ct=new CancellationTokenSource();
    ct.CancelAfter(1000);
    server.WaitForConnectionAsync(ct.Token).Wait();
    

    我希望最后一行 OperationCanceledException 一秒钟后,它却永远挂着。为什么?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Kevin Gosse    6 年前

    只有在使用非默认的异步名称dpipe时,才会检查取消令牌(是的,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();
    

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