【问题标题】:How to make BeginGetRequestStream and BeginGetResponse really asynchronous?如何使 BeginGetRequestStream 和 BeginGetResponse 真正异步?
【发布时间】:2015-01-08 08:38:39
【问题描述】:

我正在开发一个工业网络模块,该模块必须异步登录到网络服务器,然后发送小的数据请求。 首先我发送一个 GET 请求来接收会话 cookie,然后发送一个带有 UN 和 PW 的 POST 请求。 我想使用 HttpWebRequest 类中的 BeginGetRequestStream 和 BeginGetResponse 方法。但是,如果您阅读下面 MSDN 的引文,它会提到某些部分不是异步的。

我应该如何以最好的方式处理这个问题?我应该完全避免使用这些方法,还是应该建立一个故障安全机制,以便万一这些方法花费很长时间,代码就会跳过(如果这甚至可能的话)? 编码工作不是问题,重要的是确保我的模块真正异步并且永远不会阻塞主程序。

谢谢!

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

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

【问题讨论】:

  • 你为什么不使用HttpClient?它完全是async,它支持基于任务的编程模型
  • 哦,谢谢你的信息。有没有更完全不同的方法?在我投入大量时间使用 on 方法之前,我想了解一下它们(不幸的是,我已经投入了 HttpWebRequest 的时间,但我想这也是学习 VB 的时间:)
  • 例如,Await 和 Async 呢?

标签: .net asynchronous httpwebrequest synchronous


【解决方案1】:

正如我在评论中提到的,我会使用HttpClient,然后您可以使用async-await。这是一个例子

private async Task DownloadUrlAsync(string url)
{
    HttpClient httpCLient = new HttpClient();
    textBox1.Text = await httpCLient.GetStringAsync(url);
}

【讨论】:

  • 感谢这个例子,我看到 HttpClient 和 Await/Async 是 4.5 的一部分。我目前正在使用 4.0,尽管 BeginGetResponse 部分同步,您是否认为有办法通过某种方式使其故障安全来挽救我当前的项目。例如在启动 Stream/Request 之前尝试连接到服务器?还是放弃这些迂回的方式并使用 HttpClient 方法会更好? (虽然这取决于我的公司是否可以使用 4.5)
  • 更好的选择可能是WebClient msdn.microsoft.com/en-us/library/…
  • 来自 MSDN:WebClient 使用 WebRequest 和 WebResponse 类来建立与 Internet 资源的实际连接 .... 和 ....WebClient 类使用 WebRequest 类来提供对资源的访问。那么这不是使 WebClient 成为具有相同潜在问题的更“抽象”的方法吗?
  • 没错,但他们可能已经为您解决了问题。检查WebClient 文档是否说明了启动async 操作时的严重延迟。
  • 在深入研究之前,TcpClient-Class 是不是可以建立网络通信的最底层、最基础的形式?
猜你喜欢
  • 2015-04-04
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多