首页 文章

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

提问于
浏览
4

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

我会在下载过程中展示它们的进展 . 我应该支持超时 property .

我试过使用 WebClient 类 . 有 DownloadFile ()和 DownloadFileAsync ()函数 .

  • 当我使用 DownloadFile ()函数时,我可以设置Timeout属性,覆盖 GetWebRequest ()函数 . 但是,我可以't fire the event handlers, so I can' t显示进展 .

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

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

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

我怎么解决这个问题?

2 回答

  • 1

    根据MSDN documentation on HttpWebRequest,您需要使用线程自己实现 .

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

    上面的链接实际上提供了一个完整的示例,说明如何使用线程池和ManualResetEvent(示例是大约50-100行代码) .

    以下是上述解决方案的关键,代码引自MSDN示例 .

    • 使用异步BeginGetResponse .

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

    • 使用ThreadPool.RegisterWaitForSingleObject来实现超时 .

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

    • 使用ManualResetEvent保存主线程,直到请求完成或超时 .

    public static ManualResetEvent allDone = new ManualResetEvent(false); allDone.WaitOne();

  • 1

相关问题