簡體   English   中英

如何在C#中使用WebClient觸發事件處理程序並支持timeout屬性來下載文件?

[英]How can I download a file using WebClient in C# with firing the eventhandlers and supporting the timeout property?

我正在開發一個C#項目,以從Internet下載文件。

在下載過程中,我將展示它們的進度。 我應該支持超時屬性。

我試圖使用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,新的WaitOrTimerCallback(TimeoutCallback),myHttpWebRequest,DefaultTimeout,true);

  3. 使用ManualResetEvent來保存主線程,直到請求完成或超時。

    公共靜態ManualResetEvent allDone =新的ManualResetEvent(false); allDone.WaitOne();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM