【问题标题】:Asynchronous Webrequest best practices异步 Webrequest 最佳实践
【发布时间】:2010-10-09 06:04:12
【问题描述】:

异步获取网络请求的最佳做法是什么?

我想从互联网上下载一个页面(没关系) 并尽可能避免阻塞线程。

以前我认为只使用“BeginGetResponse”和“EndGetResponse”对就足够了。但仔细检查后,我还发现可以选择使用“BeginGetRequestStream”

[UPDATE] GetRequestStream 用于 POST 操作

然后更令人困惑的是,我应该使用 stream.BeginRead 和 EndRead 吗?

[UPDATE] article 建议使用 Stream.BeginRead 异步处理 HttpResponse.GetResponseStream 会更好

真是一团糟!

有人能指出正确的方向吗?

最佳实践是什么?

【问题讨论】:

    标签: .net asynchronous httpwebrequest


    【解决方案1】:

    您可以自己编写代码,也可以只使用 WebClient,它为您完成了很多繁重的工作。例如,要将文件下载为字符串,您将调用 DownloadStringAsync() 最终将触发 OnDowloadStringCompleted 事件。如果文件是二进制文件,您可以尝试使用 DownloadDataAsync()。

    【讨论】:

      【解决方案2】:

      您是否考虑过在新线程中执行 Web 请求?

      http://msdn.microsoft.com/en-us/library/ms173178.aspx

      【讨论】:

      • 启动一个新线程不太理想。简单地阻塞另一个线程并不能帮助这个应用程序扩展
      【解决方案3】:
      1. 您使用 Begin/EndGetResponse 异步等待 HTTP 响应。如果您正在执行 POST 并且需要异步发送大量数据,请使用 Begin/EndGetRequestStream。

      2. 这不是异步通信独有的 - 您可以查看同步版本以获取更多信息。

      3. 我不确定您为什么要对请求流进行读取 - 很可能您会写入它,然后从响应流中读取。

      最后,Jeffrey Richter's blog 有一篇关于 HttpWebRequest 和流的一些微妙之处的文章。

      【讨论】:

      • 是的,我认为我对“BeginGetRequestStream”的目的感到困惑
      猜你喜欢
      • 1970-01-01
      • 2011-08-12
      • 2013-02-02
      • 1970-01-01
      • 2018-12-26
      • 2018-11-24
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多