和/或何时使用其中任何一个? 这是一个偏好问题还是存在技术差异?
我要问的原因背景: 我有一个运行.NET 2.0 CF应用程序的应用程序,用户正在做几个快速操作。我没有人阻止操作,但我希望UI显示等待图标或进度图标栏。
长时间运行的操作主要是由于Web服务调用,然后是对设备本身返回数据的一些处理。
编辑在查看了Jim的答案,特别是下面的引用之后,执行异步调用的最佳做法是什么,同时避免对UI线程施加任何负担?总是在一个单独的线程中调用BeginGetResponse?
BeginGetResponse方法需要一些同步设置任务 完成(DNS解析,代理检测和TCP套接字连接, 例如)此方法变为异步之前。结果是, 永远不应该在用户界面(UI)线程上调用此方法 因为它可能需要相当长的时间(最多几分钟) 根据网络设置)完成初始同步 在抛出错误的异常或方法之前设置任务 成功。
答案 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请求是可行的方法。