加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:27:26 所属栏目:百科 来源:网络整理
导读:我正在开发一个C#项目来从互联网上下载文件. 我会在下载过程中展示它们的进展. 我应该支持超时财产. 我试过使用WebClient类. 有DownloadFile()和DownloadFileAsync()函数. 当我使用DownloadFile()函数时,我可以设置Timeout属性,覆盖GetWebRequest()函数.但是
我正在开发一个C#项目来从互联网上下载文件.

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

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

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

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

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

我怎么解决这个问题?

解决方法

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

In the case of asynchronous requests,it is the responsibility of the client application to implement its own time-out mechanism. The following code example shows how to do it.

上面的链接实际上提供了一个完整的示例,说明如何使用线程池和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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读