c# - Thread.Start(WebRequest.GetResponse) 与 WebRequest.BeginGetResponse

标签 c# performance comparison webrequest

我想下载文件,同时在 UI 上显示下载正在进行中。使用 WebRequest 我有两个选择:

  1. 使用WebRequest.BeginGetResponse和相关方法。

    优点:可以以字节为单位显示准确的进度。

    缺点:需要编写更多代码。由于同步和异步方法不能混合使用,因此我需要使用 BeginGetResponseBeginReadBeginGetRequestStream。更多需要手动实现的事情,包括读取缓冲区、超时。

  2. 启动新线程(或使用线程池),使用WebRequest.GetResponse及相关方法。

    优点:没有不必要的代码。

    缺点:无法显示确切的进度。

由于要下载的文件相当小,以字节为单位显示进度是有优势的,但不是至关重要的。如果我使用第二种方法(功能方面和性能方面),我会错过一些东西吗?

或者也许我错过了一个更高级别的广泛使用的包装器? (WebClient 不公开 WebRequest 的属性,因此它对我来说无法使用,因为我需要使用 cookie 等。)

最佳答案

如果您创建一个新线程(选项 2),该线程将在执行请求时阻塞。如果您一次只发出一个请求,那并不重要,但如果您发出大量请求,则可能会产生大量额外的线程。每个线程将花费您约 1MB RAM。

WebRequest.BeginGetResponse 这样的异步调用在请求处理过程中不会阻塞任何线程,它只会在请求完成时从线程池中选择一个线程来传递结果。

关于c# - Thread.Start(WebRequest.GetResponse) 与 WebRequest.BeginGetResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299101/

相关文章:

c# - 如果我在 c# 中序列化一个类,Unrealscript 可以读回它吗?

c# - EntityFramework - 实体代理错误

c# - 如何在 C# 中将 Color Lut 应用于位图图像

c++ - 双重简单的 for 循环与一个复杂的循环

javascript - ANT Galio 浏览器性能问题

c++ - 以这种方式比较字符串是一种好风格吗?

bash - 在 Bash shell 脚本中使用复合条件

c# - BOTS框架,空属性无法加密

mysql - 如果您尝试更新正在查询的表,MySQL 会做什么?

javascript - 比较 indexOf 的结果时的性能