C# 在不更改服务契约的情况下获得异步/等待的服务器端好处
花了一些时间在谷歌上搜索,但没有找到一个明确的答案,也不知道如何通过测试证明它(欢迎建议) 我们有一个WCF服务,它有一个等待特定事件在循环中发生的方法。在循环中,它使用Thread.Sleep来等待几个100毫秒,这在服务中是一个很大的问题(我们想重新设计它。在服务中睡眠不是一个好主意,对吧?) 我希望通过使方法异步并使用Task.Delay来提高吞吐量,而不改变服务契约。在使方法异步并重新生成contract类之后,合同签名似乎是完整的。我还可以看到生成的代码现在有一个状态机,它似乎表明它现在是异步的 我的问题是,即使我以同步方式调用异步服务方法,我是否会从线程可用于其他工作中获益?框架会等待服务方法吗 溴 我的问题是,即使我以同步方式调用异步服务方法,我是否会从线程可用于其他工作中获益 因此,异步方法的服务器端好处与客户端使用服务的方式无关 异步在服务器端和客户端是独立的。服务器上的异步支持更大的可伸缩性(这可能会增加吞吐量,也可能不会增加吞吐量)。客户端上的异步支持UI响应 网络通信在这里是一个“分隔器”,所以任何一方都可以异步或同步地处理它,而不依赖于其他应用程序 我的问题是,即使我以同步方式调用异步服务方法,我是否会从线程可用于其他工作中获益 因此,异步方法的服务器端好处与客户端使用服务的方式无关 异步在服务器端和客户端是独立的。服务器上的异步支持更大的可伸缩性(这可能会增加吞吐量,也可能不会增加吞吐量)。客户端上的异步支持UI响应C# 在不更改服务契约的情况下获得异步/等待的服务器端好处,c#,wcf,async-await,C#,Wcf,Async Await,花了一些时间在谷歌上搜索,但没有找到一个明确的答案,也不知道如何通过测试证明它(欢迎建议) 我们有一个WCF服务,它有一个等待特定事件在循环中发生的方法。在循环中,它使用Thread.Sleep来等待几个100毫秒,这在服务中是一个很大的问题(我们想重新设计它。在服务中睡眠不是一个好主意,对吧?) 我希望通过使方法异步并使用Task.Delay来提高吞吐量,而不改变服务契约。在使方法异步并重新生成contract类之后,合同签名似乎是完整的。我还可以看到生成的代码现在有一个状态机,它似乎表明它现
网络通信在这里是一个“分隔器”,因此任何一方都可以异步或同步地处理它,而不依赖于其他应用程序。方法的调用方是服务的客户端。这不是内部通话。因此框架处理方法的调用。我想知道这是否可以通过wait来完成(这样,当我的代码在等待某个东西时,线程就可以自由地进行其他服务调用了)。任务不会在服务器和客户端之间发送。因此,服务器并不关心请求是否由具有任务的客户端处理。服务器对客户端的所有了解都是一个请求负载,以及它必须发回一个响应负载的事实。因此,异步方法的服务器端好处与客户端使用服务的方式无关?方法的调用方是服务的客户端。这不是内部通话。因此框架处理方法的调用。我想知道这是否可以通过wait来完成(这样,当我的代码在等待某个东西时,线程就可以自由地进行其他服务调用了)。任务不会在服务器和客户端之间发送。因此,服务器并不关心请求是否由具有任务的客户端处理。服务器对客户端的所有了解都是一个请求负载,以及它必须发回一个响应负载的事实。因此,异步方法的服务器端好处与客户端使用服务的方式无关?感谢您的澄清。这与我对其工作原理的有限看法是一致的。这是否意味着服务器将自动等待在服务中调用的任何异步方法?对于它自己调用的方法,代码必须具有
Await
语句。好的,谢谢你的解释。我刚刚意识到我错过了使具有OperationContract属性的方法返回任务。我想我现在错过了内部等待?最简单的方法是从最低级别的方法开始,例如,将线程。睡眠更改为等待任务。延迟。编译器将指导您从那里开始:将该方法更改为async
,并在调用它的任何地方使用wait
,等等。您最终将使用您的服务实现方法。是的,我实际上就是这样做的。我只是不确定wcf框架是否会等待它。谢谢你的澄清。谢谢你的澄清。这与我对其工作原理的有限看法是一致的。这是否意味着服务器将自动等待在服务中调用的任何异步方法?对于它自己调用的方法,代码必须具有Await
语句。好的,谢谢你的解释。我刚刚意识到我错过了使具有OperationContract属性的方法返回任务。我想我现在错过了内部等待?最简单的方法是从最低级别的方法开始,例如,将线程。睡眠更改为等待任务。延迟。编译器将指导您从那里开始:将该方法更改为async
,并在调用它的任何地方使用wait
,等等。您最终将使用您的服务实现方法。是的,我实际上就是这样做的。我只是不确定wcf框架是否会等待它。谢谢你的澄清。