我想下载文件,同时在 UI 上显示下载正在进行中。使用 WebRequest
我有两个选择:
使用
WebRequest.BeginGetResponse
和相关方法。优点:可以以字节为单位显示准确的进度。
缺点:需要编写更多代码。由于同步和异步方法不能混合使用,因此我需要使用
BeginGetResponse
、BeginRead
、BeginGetRequestStream
。更多需要手动实现的事情,包括读取缓冲区、超时。启动新线程(或使用线程池),使用
WebRequest.GetResponse
及相关方法。优点:没有不必要的代码。
缺点:无法显示确切的进度。
由于要下载的文件相当小,以字节为单位显示进度是有优势的,但不是至关重要的。如果我使用第二种方法(功能方面和性能方面),我会错过一些东西吗?
或者也许我错过了一个更高级别的广泛使用的包装器? (WebClient
不公开 WebRequest
的属性,因此它对我来说无法使用,因为我需要使用 cookie 等。)
最佳答案
如果您创建一个新线程(选项 2),该线程将在执行请求时阻塞。如果您一次只发出一个请求,那并不重要,但如果您发出大量请求,则可能会产生大量额外的线程。每个线程将花费您约 1MB RAM。
像 WebRequest.BeginGetResponse
这样的异步调用在请求处理过程中不会阻塞任何线程,它只会在请求完成时从线程池中选择一个线程来传递结果。
关于c# - Thread.Start(WebRequest.GetResponse) 与 WebRequest.BeginGetResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299101/