【发布时间】:2014-06-01 03:59:05
【问题描述】:
我正在使用 WCF 进行流式处理,我对 MSDN 关于 WCF 中的大数据和流式处理的文章中的“Enabling Asynchronous Streaming”段落的含义有疑问。
要启用异步流式传输,请添加
DispatcherSynchronizationBehavior服务的端点行为 主机并将其AsynchronousSendEnabled属性设置为true。我们有 还增加了发送时真正的异步流的能力 边。这提高了服务在以下场景中的可伸缩性 正在将消息流式传输到多个客户端,其中一些客户端运行缓慢 阅读可能是由于网络拥塞或根本不阅读。 在这些场景中,我们现在不会阻塞 每个客户的服务。这确保了服务能够处理 更多的客户端,从而提高服务的可扩展性。
我明白上面的意思是我加了
<behaviors>
<endpointBehaviors>
<behavior name="AsyncStreaming">
<dispatcherSynchronization asynchronousSendEnabled="true" />
</behavior>
</endpointBehaviors>
...
到我的web.config 文件并在我的端点中引用AsyncStreaming 行为,但是我不明白这些步骤对我有什么作用。我是否需要修改我的代码才能利用这种异步性?
同样关于一个类似的主题(但如果它太不同我会将它移到一个新问题),如何在 WCF 中使用 Streams 使用 async/await 效果?我可以在我的服务合同中使用Task<Stream> Foo() 吗?我进行了一些数据库调用,最终将其结果包装到一个自定义流中,该流将从 WCF 服务返回。能够使用ExecuteDataReaderAsync() 之类的东西非常有用,在处理流式消息而不是缓冲消息时我还能使用它吗?
我已经对其进行了测试,并且我知道它使用任务“有效”,但我不知道这样做是否会导致函数回退到“缓冲”模式,就像您向函数提供多个参数时一样(请参阅在同一 MSDN 页面上的“Programming Model for Streamed Transfers”的第 3 段),我不知道如何检查是否发生这种情况。
【问题讨论】:
-
嗨斯科特!我对任务包装的结果完全有同样的疑问。您能否确认它们的使用是否会导致通道恢复到“缓冲”模式?
标签: c# wcf asynchronous streaming async-await