同步与异步与Web服务相关

6
我试图在网络上找到一个好的解释来说明 Web 服务中同步通信与异步通信的区别,但似乎即使那些愿意提供答案的人也对此感到困惑。一个答案完全相反于另一个答案。
如果有人能给出一个清晰的关于上述问题的区别的好解释,那将对未来遇到相同问题的所有人都是有益的。

问题是在这种情况下,“同步 vs 异步”不够具体。通过示例进行解释,告诉我们您正在尝试做什么以及您想要它做什么,并让我们知道您遇到了什么问题。 - Scott Chamberlain
4个回答

16

异步服务

假设您有一个长时间运行的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");
对于这个示例,您期望在“成功”之前看到“已调用”显示,因为它不会等待服务返回才继续。您调用的服务不必是“异步”的。
编辑:
正如评论中指出的那样,您还可以以同步方式调用异步服务的客户端(即服务将不会阻塞工作线程以进行进一步的请求,但客户端将在那一侧阻塞)。

2
小修正:服务实现的异步/同步性质与客户端调用的异步/同步性质完全独立。客户端可以异步调用同步服务(如您所指出的),客户端也可以同步调用异步服务。 - Stephen Cleary

6
首先,让我们澄清一下同步和异步的疑惑。 同步通信是指直接通信,通信双方时间同步。这意味着参与通信的所有方都在同一时间出席。这包括但不限于电话交谈(非短信)、公司董事会会议、聊天室活动和即时消息。 异步通信不要求参与通信的所有方同时出席。例如电子邮件、讨论版、博客和手机短信等。在远程(特别是在线)教育中,异步通信是主要(有时是唯一)的通信方法。通常,我们在每个班级中使用不同的讨论版,每个班级都有自己的目的。
例如: 同步通信 当我给你打电话时,我拨打你的号码并等待你接听。然后你说话,我立即听到。当你结束时,我向你发送数据(与你交谈),你立即收到(听我说)。在我们的通信结束时,我们中的一个人说“传输结束”(再见),另一个人说“确认”(再见),然后挂电话。 异步通信 我写信给你。我把它放在邮局,它会被发送给你。与此同时,我不需要等待。我做许多不同的其他事情。然后你收到了这封信。当我还在忙其他事情时,你阅读它。然后你给我写回信并把它发送给我。我不参与所有这些事情。第二天,我会从系统(邮递员)得到一条(同步)消息(信号)。它(他)说:“这是一条消息给你”。或者,我可以每隔五分钟轮询我的收件箱,检查是否有新的信件。然后我暂停其他工作,接收你的信并阅读你的回答。然后我根据这个答案做一些事情。但这些是你不会注意到的事情,因为你不参与我对你的异步回答所做的事情。
参考来源:同步和异步通信如何工作

1
电话的例子并不适用于Web服务调用的上下文环境。呼叫方和被呼叫方都可以自由地继续进行或开始进行除了通话以外的任何其他活动。呼叫方不必等待被呼叫方回应,他/她可以在等待响应时参与新的活动。工作线程/用户界面线程不会被阻塞。您的例子可能适用于电路交换通信,但不适用于Web服务。 - Abhitalks
1
@abhitalks 是的,我同意这个观点。此外,我并没有用webservice来进行解释,只是想作出相关联系。 实际的根级别可能是不同的,但如果你看到了整个图景,无论是一个电路设计、webservice还是ajax调用,本质都是相同的。 它只是在强调同步和异步之间的区别。 - Nipun Ambastha
1
不好意思,这个比喻还是不正确。OP明确问的是关于Web服务的。请看上面Paddy的回答,那才是正确的。在同步调用时,您无法做任何其他事情。电话的比喻实际上恰恰相反。被叫方实际上可以在通话进行时做任何其他事情。甚至可以在另一个频道上拨打另一个电话。 - Abhitalks
您讲解得非常好。但我的疑问是为什么在 .NET 中使用 async 和 await 关键字进行异步通信?为什么不使用同步编程? - Praveen_Shukla

1
在编程方面,同步通信是指与服务器的通信与其他请求同时发送。例如,如果一个ajax调用是同步的,它将阻止其他资源的下载。而异步通信则是独立于Web服务/页面中的其他资源的通信方式,这种通信方式更常见。

1

同步 - 你给朋友打电话,他接听并回答了你的问题。 异步 - 你给朋友发了一条短信,但是他可能会立即回复,也可能在10分钟后回复,或者两天后才回复。这种情况下,你不期望朋友立即回复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接