如何在 C# 中使用 WebClient 下载文件,并触发事件处理程序并支持超时属性



我正在开发一个C#项目来从互联网下载文件。

我将在下载过程中显示它们的进度。我应该支持超时属性。

我尝试使用WebClient类。有 DownloadFile() 和 DownloadFileAsync() 函数。

  • 当我使用 DownloadFile() 函数时,我可以设置 Timeout 属性,覆盖 GetWebRequest() 函数。但是,我无法触发事件处理程序,因此无法显示进度。
  • 当我使用 DownloadFileAsync() 函数时,我可以触发事件处理程序,这样我就可以显示进度。但是,在这种情况下,我无法设置超时。

从互联网上,我可以找到一些关于使用线程手动设置超时的方法的文章。

但是,我认为所有这些都是不正确的。他们在整个下载过程中设置超时。但是根据文件的大小,下载时间会短或长。

如何解决这个问题?

根据 HttpWebRequest 上的 MSDN 文档,您需要使用线程自己实现这一点。

对于异步请求,客户端应用程序负责实现自己的超时机制。下面的代码示例演示如何执行此操作。

上面的链接实际上给出了如何使用线程池和 ManualResetEvent 执行此操作的完整示例(该示例大约是 50-100 行代码)。

下面是上述解决方案的关键,其中的代码引用自 MSDN 示例。

  1. 使用异步 BeginGetResponse

    IAsyncResult result= (IAsyncResult) myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback),myRequestState);

  2. 使用 ThreadPool.RegisterWaitForSingleObject 实现超时。

    ThreadPool.RegisterWaitForSingleObject (result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true);

  3. 使用 ManualResetEvent 保持主线程,直到请求完成或超时。

    公共静态手动重置事件全部完成 = 新的手动重置事件(假);allDone.WaitOne();

尝试显示这一点

http://www.codeproject.com/Articles/35954/C-NET-Background-File-Downloader

最新更新