我试图找到一个很好的解释来解释网络服务的同步通信与异步通信之间的区别,整个互联网。但似乎即使是愿意为问题提供答案的人也对此感到困惑。一个答案与另一个答案完全相反。
如果有人能以一个清晰的思路对上述问题的区别提供一个很好的解释,那将对以后遇到同样问题的每个人都有帮助。
我试图找到一个很好的解释来解释网络服务的同步通信与异步通信之间的区别,整个互联网。但似乎即使是愿意为问题提供答案的人也对此感到困惑。一个答案与另一个答案完全相反。
如果有人能以一个清晰的思路对上述问题的区别提供一个很好的解释,那将对以后遇到同样问题的每个人都有帮助。
异步服务
假设您有一个长时间运行的 Web 服务(假设它从文件系统读取一个大文件并进行一些处理)。
如果您将其设置为“同步”Web 服务(使用 WCF 定义),则调用客户端将不得不等待处理完成,并且通常这将在处理时阻塞 asp.net 工作线程之一完成。对于具有高流量的服务,这可能会成为问题。
如果您将其设置为异步 Web 服务,那么您的意思是您的代码会将一些长时间运行的处理委托给另一个线程,或者使用非阻塞机制,并且这将在某个时候返回将来(如果您使用的是 c# 5.0,那么您可能需要查看 async 和 await 关键字的示例)。
例如,可以使用 async ReadFile 方法之一来读取大文件。
这不会阻塞 asp.net 工作线程之一,从而允许潜在的更大吞吐量。
(当人们提到对同一个服务进行多个同时调用(通常通过网页上的 AJAX)时,通常会出现一些混淆 - 虽然来自页面的调用通常会使用 javascript 中的异步机制进行,但这并不完全是与上面描述的相同 - 我喜欢在脑海中区分多个并行调用和异步调用)
异步调用
还值得注意的是,即使该服务未设置为“异步”,您也可以对服务进行异步调用。这就是 javascript 中的 AJAX 调用的工作方式,例如
var jqxhr = $.ajax( "AnyService.svc" )
.done(function() { alert("success"); })
.fail(function() { alert("error"); })
.always(function() { alert("complete"); });
alert("Called");
对于此示例,您希望在“Success”之前看到“Called”,因为这不会等待服务在继续之前返回。您调用的服务不必是“异步的”。
编辑
正如评论中所指出的,您还可以拥有一个以同步方式调用“异步”服务的客户端(即,该服务不会阻塞工作线程以进行进一步的请求,但客户端会在该端阻塞)。
首先让我们清除您对同步和异步的疑问
同步通信是直接通信,其中通信器是时间同步的。这意味着参与通信的所有各方同时在场。这包括但不限于电话交谈(不是短信)、公司董事会会议、聊天室活动和即时消息。
异步通信不要求参与通信的所有各方同时在场。一些示例是电子邮件消息、讨论板、博客和手机短信。在远程(特别是在线)教育中,异步通信是主要的(有时是唯一的)通信方法。通常,我们在每个班级使用不同的讨论板,每个讨论板都有自己的用途。
例如 同步
当我打电话给你时,我会拨你的号码,然后等你接电话。然后你说点什么,同时我也听你的。完成后,我会向您发送数据(与您交谈),同时您会收到它们(听我说)。在我们的通信结束时,我们中的一个说“END OF TRANSMISSION”(再见),另一个说“Acknoledged”(再见),然后双方都挂断了电话。
异步
我给你写信。我把它放到邮局,它会寄给你的。同时我不等待。我做很多不同的事情。然后你会收到这封信。当我还在做许多不同的事情时,你读了它。然后你给我写一个答案并发给我。所有这些事情我都没有参与。第二天,我从系统(邮递员)收到一条(同步)消息(信号)。它(他)说:“这是给你的信息”。或者,我可以每五分钟轮询一次收件箱,检查是否有新信。然后我暂停我的其他工作,收到您的来信并阅读您的答复。然后我根据这个答案做一些事情。但这是您不会注意到的事情,因为您没有参与我对您的异步答案所做的事情。
好吧,您的问题不是很具体,但这可能会有所帮助:在最基本的级别上,同步通信是在与服务器的通信发生的同时发送对其他资产的其他请求。例如,如果 ajax 调用是同步的,它将阻止其他资产下载。
异步通信是指通信独立于 Web 服务/页面中的其他资产。这种交流使用得更频繁。
同步 - 您正在给朋友打电话,他接听电话并回复您。异步 - 您在朋友的手机上发送了一条短信,但您的朋友可能会立即回复,也可能会在 10 分钟后或 2 天后回复。在这种情况下,您不希望您的朋友立即给出答复。