【问题标题】:NamedPipeServerStream and the await keywordNamedPipeServerStream 和 await 关键字
【发布时间】:2015-06-16 22:47:37
【问题描述】:

为 Async CTP 库 v3.0 编写的文章 C# Named Pipes with Async 使用的代码无法使用 .NET 4.5 编译。具体

await pipe.WaitForConnectionAsync();

var message = await streamReader.ReadToEndAsync();

失败,因为没有NamedPipeClientStream这样的方法。

在 CTP 和 .NET 4.5 中包含这方面有什么变化吗?我错过了完成这项工作的步骤吗?

【问题讨论】:

    标签: c# .net-4.5 async-ctp


    【解决方案1】:

    在 Async CTP 中实现的 *Async 方法是临时扩展方法(即它们是未添加到所涉及的实际类中的扩展方法)。 RTM 将那些Async 方法“移动”到适用类的实例方法中。我认为“移动”并不像复制扩展方法那么容易,并且涉及到一些工作/测试/验收。我收集到有些人因为各种原因无法动弹。 NamedPipeServerStream.WaitForConnectionAsync 似乎是其中一种方法。您必须使用TaskFactory.FromAsync 方法从BeginWaitForConnection/EndWaitForConnection 对到await 上创建一个Task 对象。类似:

        await Task.Factory.FromAsync(pipe.BeginWaitForConnection,
            pipe.EndWaitForConnection, null);
        StreamReader reader = new StreamReader(pipe);
        await reader.ReadToEndAsync();
    

    【讨论】:

    • 谢谢——希望我早点看到这个。
    • 唯一的缺点是必须手动执行此操作,这意味着不支持使用取消令牌,这就是我在管道上使用这些一流异步方法的全部原因。
    • @donvan BeginWaitForConnection 不可取消。您可以关闭管道以“取消”等待;但是,如果调用 CancellationTokenSource.Cancel() 时,您是否真的希望发生这种情况,从而使管道变得无用?
    猜你喜欢
    • 2012-11-28
    • 2015-06-08
    • 2015-05-04
    • 2012-06-29
    • 2019-05-31
    • 2020-04-20
    • 2013-05-26
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多