我试图在网络上找到一个好的解释来说明 Web 服务中同步通信与异步通信的区别,但似乎即使那些愿意提供答案的人也对此感到困惑。一个答案完全相反于另一个答案。
如果有人能给出一个清晰的关于上述问题的区别的好解释,那将对未来遇到相同问题的所有人都是有益的。
如果有人能给出一个清晰的关于上述问题的区别的好解释,那将对未来遇到相同问题的所有人都是有益的。
异步服务
假设您有一个长时间运行的Web服务(比如从文件系统读取大型文件并进行一些处理)。
如果将其设置为“同步”Web服务(使用WCF的定义),那么调用客户端将不得不等待处理完成,通常这会阻塞在处理完成时的ASP.NET工作线程之一。对于高流量的服务,这可能会变成问题。
如果将其设置为异步Web服务,则意味着您的代码将委托一些长时间运行的处理到另一个线程,或使用非阻塞机制,并且这将在将来的某个时间返回结果(如果使用C# 5.0,则可以查看异步和等待关键字的示例)。
例如,可以使用其中一个异步ReadFile方法来读取大型文件。
这将不会阻塞ASP.NET工作线程之一,从而允许潜在更大的吞吐量。
(当人们提到对同一服务进行多个并行调用时(通常通过Web页面上的AJAX进行调用)时,往往会引起一些混淆 - 虽然页面上的调用通常是使用JavaScript中的异步机制进行调用,但这与上述描述不完全相同 - 我喜欢在脑海中保持对多个并行调用和异步调用之间的区别)
异步调用
值得注意的是,即使该服务没有设置为“异步”,您仍然可以对其进行异步调用。这就是JavaScript中的AJAX调用的工作方式。
var jqxhr = $.ajax( "AnyService.svc" )
.done(function() { alert("success"); })
.fail(function() { alert("error"); })
.always(function() { alert("complete"); });
alert("Called");
对于这个示例,您期望在“成功”之前看到“已调用”显示,因为它不会等待服务返回才继续。您调用的服务不必是“异步”的。同步 - 你给朋友打电话,他接听并回答了你的问题。 异步 - 你给朋友发了一条短信,但是他可能会立即回复,也可能在10分钟后回复,或者两天后才回复。这种情况下,你不期望朋友立即回复。