我正在开发一个只接受HTTP的WCF RESTful Web服务。我对更改为异步模式几乎没有疑问。
-
几乎所有演示如何使用 TPL 实现异步 WCF 操作协定的示例都使用基于 WCF 客户端代理的客户端,在我的情况下,客户端可能是仅支持 HTTP 谓词的浏览器,因此似乎将我的 WCF 服务更改为异步模式没有那么有意义。我可以说,如果一个服务是 RESTful 并且每个请求不需要很长时间来处理,那么我将不会从将服务同步更改为异步中受益匪浅吗?
-
如果我的服务运营合同是单向服务或不向客户返回任何内容,则应将运营合同定义为
async Task DoSthAsync()
或void DoSth()
?这里有什么区别?换句话说,我是否应该等待/返回任务.运行。 -
我的服务接受使用 HTTP POST 从客户端发送的大块数据,假设处理需要一段时间,因此更改为异步模式可以提高服务并发性和吞吐量,如何确保传入流对象不会由 WCF 在委托中
Task.Run(() => {})
释放?
1.几乎所有演示如何使用 TPL 实现异步 WCF 操作协定的示例都使用基于 WCF 客户端代理的客户端,在我的情况下,客户端可能是仅支持 HTTP 谓词的浏览器,因此似乎将我的 WCF 服务更改为异步模式没有那么有意义。我可以说,如果一个服务是 RESTful 并且每个请求不需要很长时间来处理,那么我将不会从将服务同步更改为异步中受益匪浅吗?
问题 1 完全不存在,因为您说要在 WCF 服务器端而不是客户端使用 TPL。
@CodingYoshi 我对客户没有任何假设。我在这里完全专注于服务器端。
.
2.如果我的服务操作合约是单向服务或未向客户端返回任何内容,则操作合约应定义为异步任务DoSthAsync()或无效DoSth()?这里有什么区别?换句话说,我是否应该等待/返回任务.运行。
您没有在服务协定中指定服务是否异步。这是您的服务的内部。无论服务是否异步执行操作,客户端仍可以同步或异步调用服务。例如,如果您的服务将内容写入文件,并且写入需要 5 分钟,并且您已实现同步执行此操作,则客户端仍然可以异步(或同步)调用您的服务。如果您已经异步实现了这一点,那么处理调用的线程池线程将可以自由地处理其他调用。换句话说,这些更改只会影响服务器端。
还要记住,如果你正在做一些真正异步的事情,那么异步做这件事将是有益的。如果您正在执行 CPU 密集型操作,则异步执行实际上会损害性能。为什么?因为当请求到达 ASP.NET(WCF、MVC、Web 窗体或其他)时,处理请求的最有效方法是使用一个线程池线程来执行此操作。如果您正在执行 CPU 密集型操作,那么该线程是否执行该操作,或者您启动Task
而另一个线程接管,将没有什么不同。但是,您将为切换上下文付出代价。
3.My 服务接受使用 HTTP POST 从客户端发送的大块数据,假设处理需要一段时间,因此更改为异步模式可以提高服务并发性和吞吐量,如何确保传入流对象不会由 Task.Run(() => {})delegate 中的 WCF 释放?
当请求到达 WCF 入口时,无论是异步处理还是同步处理它,除非整个操作完成,否则不会发送响应。那么,为什么要处理传入的流呢?
我认为您不清楚整个异步概念。无论服务是否异步,客户端仍需要确保调用不会阻塞。例如,如果客户端调用操作,它们可以:
- 等到他们收到回复,什么都不做,或者
- 调用服务,执行其他操作,一旦响应返回,它们就会处理响应。