在另一个线程中进行异步Web服务调用和进行同步Web服务调用之间有什么区别?

时间:2013-05-13 21:24:02

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

和/或何时使用其中任何一个? 这是一个偏好问题还是存在技术差异?

我要问的原因背景: 我有一个运行.NET 2.0 CF应用程序的应用程序,用户正在做几个快速操作。我没有人阻止操作,但我希望UI显示等待图标或进度图标栏。

长时间运行的操作主要是由于Web服务调用,然后是对设备本身返回数据的一些处理。

编辑在查看了Jim的答案,特别是下面的引用之后,执行异步调用的最佳做法是什么,同时避免对UI线程施加任何负担?总是在一个单独的线程中调用BeginGetResponse?

  

BeginGetResponse方法需要一些同步设置任务   完成(DNS解析,代理检测和TCP套接字连接,   例如)此方法变为异步之前。结果是,   永远不应该在用户界面(UI)线程上调用此方法   因为它可能需要相当长的时间(最多几分钟)   根据网络设置)完成初始同步   在抛出错误的异常或方法之前设置任务   成功。

2 个答案:

答案 0 :(得分:3)

在后台进行同步通话将在通话期间占用一个线程。

线程不是免费的。特别是如果你拨打很多电话,那可能会产生很大的开销。

异步调用不涉及单独的线程,因此效率更高。

答案 1 :(得分:2)

如果您进行异步Web服务调用,则在解析DNS期间,UI 可能被捆绑一段时间。 BeginGetResponse方法在之前解析DNS ,它会进行异步方法调用以获取响应。因此,如果DNS解析需要任何时间(通常非常快,但有时可能需要几秒钟),那么UI将无法响应。

有关详细信息,请参阅Is This Really Asynchronous?

除此之外,只要您在回调中处理响应(在单独的线程上执行),UI响应性就没有区别。这里的区别在于,对于异步请求,单独的线程仅在处理结果期间处于活动状态。在线程执行同步请求时,线程在整个请求和处理期间都处于活动状态。对于大多数Web服务调用,处理所需的时间比发出请求和等待结果要少得多。

如果您发出批次请求,那么每次调用时都会遇到资源耗尽的风险。但是在现代硬件上,你必须每秒发出数十个请求才能成为一个问题。

所有这一切,你可能应该使用异步Web请求。如果您使用这些请求访问相同的域(或少量域),则将从本地缓存满足DNS解析,这意味着它将不会花费任何时间。并且由于过多的并发线程,您减少(几乎完全消除)资源耗尽的风险。

有趣的是,HttpWebRequest.BeginGetResponse的文档说:

  

在此方法变为异步之前,BeginGetResponse方法需要完成一些同步设置任务(例如,DNS解析,代理检测和TCP套接字连接)。因此,永远不应在用户界面(UI)线程上调用此方法,因为在完成初始同步设置任务之前,可能需要相当长的时间(最多几分钟,具体取决于网络设置)抛出错误的异常或方法成功。

虽然这可能是一般的建议,但我的上述评论仍然适用:如果您的所有电话都转到同一台服务器或同一组服务器(通常是内部应用程序的情况),则该警告无关紧要。 DNS将被缓存,代理将被设置等。如果代理设置在每个连接上花费大量时间,您需要与IT部门联系以获得解决方案。根据我的经验,异步Web请求是可行的方法。