【问题标题】:Why Implement an Asynchronous WCF Service Operation为什么要实现异步 WCF 服务操作
【发布时间】:2016-01-02 20:58:28
【问题描述】:

我找到了解释如何实现异步 WCF 服务操作的文档:

https://msdn.microsoft.com/en-us/library/ms731177(v=vs.110).aspx

这让我想知道,当客户端可以自己生成操作的异步版本时,为什么(或何时)要使我的服务操作异步。当客户端生成操作的异步版本时,是否与服务本身已经实现了异步操作一样?

另外,在文档的示例代码中,end 方法没有 OperationContractAttribute。为什么?

【问题讨论】:

  • 这也让我感到困惑。似乎每个人都在为 Aync Await 疯狂,但如果服务器已经在处理请求时,我们就无法获得太多的效率提升,而且我们会感到很头疼。似乎如果您拥有一台具有大量处理能力的服务器,您就可以处理更多负载。这是唯一的原因吗?
  • 我认为当客户端生成操作的异步版本时,它仍然在服务器上同步运行。对吗?
  • 是的,那些将是客户端机器上的异步请求(他们以这种方式生成它们),但它们仍将在服务器机器上同步运行,因为它们最初不是异步函数。所以是的,我认为只有超高流量服务器才需要实现异步服务操作。
  • 几乎与您同在。但是如果不使用某种锁,它们也不会在服务器上同步运行。每个请求都存在于一个单独的线程中,对吧?因此,如果我从同一个客户端异步分派 DoThing1,然后是 DoThing2,则 DoThing2 有可能首先完成,因为它们在不同的线程中运行。因此,当线程可以说处理这个线程的一部分,然后处理那个线程的一部分时,它只是所有线程都在使用中的那一点点流量。
  • 如果你是处理器绑定异步是没有意义的(不再是太多了)...如果你是 I/O 绑定异步给你更好的性能。

标签: c# wcf


【解决方案1】:

我认为您的问题的答案就在您提供的链接之后。 在这里 (https://msdn.microsoft.com/en-us/library/ms734701%28v=vs.110%29.aspx) 你可以看到:

如果操作服务实现进行阻塞调用(例如执行 I/O 工作),则在服务操作实现中使用异步方法。在异步操作实现时,尽量调用异步操作和方法,尽量扩展异步调用路径。例如,从 BeginOperationOne() 中调用 BeginOperationTwo()。

因此,当您的服务使用其他服务(例如 Redis)或下载任何内容时,以异步方式实现这些操作并且不阻塞服务器的工作线程是绝对完美的。工作线程的数量是有限的,在某些时候你的服务器会卡住,因为它们都在服务调用。在异步实现的情况下,您可以利用 I/O 完成端口和来自单独线程池的适当 I/O 线程。 I/O completion ports 是 Windows 中非常有效的机制,有助于避免资源浪费。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多