【问题标题】:How do I make a .NET 4 thread wait for asynchronous requests to finish?如何让 .NET 4 线程等待异步请求完成?
【发布时间】:2011-03-12 07:13:38
【问题描述】:

我正在使用 HttpWebRequest.BeginGetRequest() 从单个方法发出 500 个异步 HTTP 请求。我希望该方法等到我收到所有请求的响应或它们超时。

最好的方法是什么?

我目前正在将异步调用包装在任务对象列表中以使用 Tasks.WaitAll(),但在我知道这是一个很好的解决方案之前,我不想在兔子洞中走得太远。

有什么想法吗?

编辑

我实现了计数器,它们可以工作,但我对使用本页所示的委托感到好奇。

Multi-threading and Async Examples

以前有人做过类似的事情吗?是不是有点矫枉过正?

【问题讨论】:

    标签: c# asp.net .net-4.0


    【解决方案1】:

    我目前正在将异步调用包装在 Task 对象列表中以使用 Tasks.WaitAll()

    如果您真的想在此时强制这些“任务”同步和阻塞,这是一个相当干净的解决方案。这是Task.WaitAll() 背后的主要理由,而且很好,因为它(可选)允许您在超时后取消阻塞操作,如果您愿意的话。

    【讨论】:

      【解决方案2】:

      我个人不会阻塞线程,它违背了异步模型的目的。

      如果我必须等待这些网络请求完成才能继续,我会改为保留一个计数器,每次成功或失败的请求被回调时都会递增。

      检查每个回调的计数器,如果它达到了您想要的计数,然后让线程继续......

      通过这种方式,您还可以让您的 UI 保持美观和响应迅速,并可能更新计数器/进度条 - 即使您没有在 UI 线程上启动这些,也很高兴向用户提供一些关于什么是视觉反馈继续。

      【讨论】:

      • 感谢您的反馈。我想我可以很容易地实现一个计数器。我不关心 UI 响应能力,因为这是一次性解决方案。它基本上是一个网络服务,当被调用时,它会查询一堆主机,解析响应,然后将响应放入数据库。
      • 这里假定管理异步任务的调用线程必须是 UI 线程。让 UI 线程生成一个异步任务来管理所有其他任务并报告它们的进度可能会更好,而不是为此增加 UI 逻辑的负担。
      • @Tyler 说:“我个人不会阻塞线程,它违背了异步模型的目的。”有时您必须等待所有线程完成,例如在控制台应用程序中。如果控制台应用程序立即退出,所有这些线程都会立即终止而未完成。
      最近更新 更多