![](/img/trans.png)
[英]wb.DownloadFileAsync throw “WebClient does not support concurrent I/O operations.” exception
[英]WebClient does not support concurrent I/O operations.
如果用戶單擊某個按鈕,則使用WebClient的DownloadStringAsync方法下載HTML頁面。 如果他們想在當前操作完成之前停止當前操作並開始新操作,則調用CancelAsync方法,並將WebClient對象設置為null。 在第二個按鈕的事件處理程序中,我還重新初始化了WebClient對象,並最終嘗試下載新內容。 WebClient對象是全局變量。 我得到的錯誤是:
WebClient does not support concurrent I/O operations.
有沒有一種方法可以強制WebClient取消其當前操作並開始新操作?
似乎您正在嘗試在第一次下載完成之前使用第二個WebClient實例下載第二個文件。 創建WebClient的新實例肯定可以解決該問題。 CancelAsync()嘗試取消進行中的下載,但可能仍會運行一會兒。 下載完成/取消下載后,將引發DownloadStringCompleted事件處理程序,使您可以使用相同的WebClient實例開始新的下載。
您看到的錯誤聽起來更像是嘗試對WebClient進行跨線程使用,這是不允許的。 換句話說,必須在最終將調用DownloadStringAsync的同一線程上創建WebClient。 說得通? 您需要重新考慮一下您的設計。 如果您確實想使WebClient實例保持全局訪問性,則可以考慮使用ThreadLocalAttribute。
您可以編寫一個WebClient類,並且可以在具有不同異步請求的循環中調用它。 如,
WebClient client = new WebClient();
try
{
client.DownloadStringCompleted += (object newSender, DownloadStringCompletedEventArgs e) =>
{
Dispatcher.BeginInvoke(() =>
{
try
{
var response = e.Result;
// your response logic.
}
catch (Exception)
{
MessageBox.Show("Problem occured");
}
});
};
}
catch
{
MessageBox.Show("Problem occured");
}
finally
{
if (userHasCanceled)
client.DownloadStringAsync(new Uri("xyz"));
}
client.DownloadStringAsync(new Uri("abc"));
因此,當您調用client.CancelAsyn()
它可能會拋出一個exception
,該exception
在try-catch塊中處理,最后您可以在finally塊中調用一個新的異步請求。 您也可以在“ finally”塊中放入檢查,以確認用戶是否已canceled
操作,如果yes
則調用新的異步請求, else
不執行任何操作。
我希望這是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.