关于WCF中的异步

时间:2017-05-23 01:01:48

标签: c# .net web-services wcf asynchronous

我正在开发一个只接受HTTP的WCF RESTful Web服务。关于更改为异步模式我几乎没有问题。

  1. 几乎所有演示如何使用TPL实现异步WCF操作合同的示例都使用基于WCF客户端代理的客户端,在我看来,客户端可能是仅支持HTTP谓词的浏览器,因此它似乎正在改变我的WCF服务异步模式没那么有意义。我可以说,如果一个服务是RESTful并且每个请求都不需要很长时间来处理,我将不会从更改同步到异步的服务中获益很多吗?

  2. 如果我的服务操作合同要么是OneWay服务,要么不向客户返回任何内容,那么操作合同应该定义为async Task DoSthAsync()void DoSth()?这有什么区别?换句话说,我是否应该等待/返回Task.Run。

  3. 我的服务接受使用HTTP POST从客户端发送的大块数据,假设处理需要一段时间,因此更改为异步模式可以提高服务并发性和吞吐量,如何确保传入流WCF在Task.Run(() => {})委托中处理对象?

1 个答案:

答案 0 :(得分:0)

  

1.几乎所有演示如何使用TPL实现异步WCF操作合同的示例都使用基于WCF客户端代理的客户端,在我的情况下,客户端可能是仅支持HTTP谓词的浏览器,因此它似乎将我的WCF服务更改为异步模式没那么有意义。我可以说,如果一个服务是RESTful并且每个请求都不需要很长时间来处理,我将不会从更改同步到异步的服务中获益很多吗?

问题1完全是因为你说你想在WCF服务器端而不是客户端使用TPL。

  

@CodingYoshi我对客户没有任何假设。我完全专注于服务器端。

  

2.如果我的服务操作合同要么是OneWay服务,要么不向客户返回任何内容,操作合同应该定义为async Task DoSthAsync()或void DoSth()?这有什么区别?换句话说,我是否应该等待/返回Task.Run。

您未在服务合同中指定服务是否异步。这是您服务的内部。无论您的服务是否异步执行,客户端仍可以同步或异步调用您的服务。例如,如果您的服务将内容写入文件并且写入需要5分钟并且您已实现同步执行此操作,则客户端仍可以异步(或同步)调用您的服务。如果您异步实现了这个,那么处理该调用的线程池线程将可以自由地处理其他调用。换句话说,更改只会影响服务器端。

另外请记住,如果您正在做一些真正异步的事情,那么异步执行它将是有益的。如果您正在进行CPU密集型操作,那么异步执行操作实际上会损害性能。为什么?因为当请求来到ASP.NET(WCF,MVC,Web窗体或其他)时,处理请求的最有效方法是使用一个线程池线程来完成。如果您正在进行CPU密集型操作,那么该线程是否执行此操作,或者您启动Task并且另一个线程接管,将没有什么不同。但是,您将为切换上下文付出代价。

  

3.我的服务接受使用HTTP POST从客户端发送的大块数据,假设处理需要一段时间,因此更改为异步模式可以提高服务并发性和吞吐量,如何确保传入流对象WCF在Task.Run(()=> {})委托?

中没有处理

当请求到达WCF门时,无论是异步还是同步处理,除非并且直到整个操作完成,否则不会发送响应。那么为什么要传入流中?

我认为你并不清楚整个异步概念。无论您的服务是否异常,客户端仍然需要确保呼叫不会阻塞。例如,如果客户端调用操作,则可以:

  1. 等到收到回复后再做其他事情或
  2. 调用服务,做其他事情,一旦响应返回,他们就会处理响应。