【发布时间】: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 绑定异步给你更好的性能。