gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:32:26 26 4
gpt4 key购买 nike

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

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

我试过使用 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示例。

  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 保持主线程直到请求完成或超时。

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

关于c# - 如何在 C# 中使用 WebClient 下载文件并触发事件处理程序并支持超时属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com