4

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

我会在下载过程中展示他们的进度。我应该支持超时属性。

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

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

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

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

我怎么解决这个问题?

4

2 回答 2

1

试着展示这个

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

于 2012-07-05T08:41:42.053 回答
1

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

在异步请求的情况下,客户端应用程序负责实现自己的超时机制。以下代码示例显示了如何执行此操作。

上面的链接实际上给出了如何做到这一点的完整示例,使用线程池和ManualResetEvent(示例大约 50-100 行代码)。

这是上述解决方案的症结所在,代码引用自 MSDN 示例。

  1. 使用异步BeginGetResponse

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

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

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

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

    公共静态 ManualResetEvent allDone = new ManualResetEvent(false); allDone.WaitOne();

于 2012-07-05T08:44:23.957 回答