簡體   English   中英

WebClient不支持並發I / O操作。

[英]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 ,該exceptiontry-catch塊中處理,最后您可以在finally塊中調用一個新的異步請求。 您也可以在“ finally”塊中放入檢查,以確認用戶是否已canceled操作,如果yes則調用新的異步請求, else不執行任何操作。

我希望這是您想要的。

暫無
暫無

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

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