2012-12-07 128 views
2

如果用戶單擊某個按鈕,我正在使用WebClient的DownloadStringAsync方法下載html頁面。如果他們想要在完成當前操作並開始新操作之前停止它,則調用CancelAsync方法並將WebClient對象設置爲null。在第二個按鈕的事件處理程序中,我還重新初始化WebClient對象,並最終嘗試下載新內容。 WebClient對象是一個全局變量。我得到的錯誤是:WebClient不支持併發I/O操作。

WebClient does not support concurrent I/O operations. 

有沒有辦法迫使Web客戶端取消其當前操作,並開始一個新的?

回答

1

錯誤您所看到的聲音更像這是不允許的Web客戶端的跨線程使用的一種嘗試。換句話說,WebClient必須在最終調用DownloadStringAsync的同一個線程上創建。合理? 你需要重新考慮一下你的設計。如果您確實想讓WebClient的實例全局可訪問,您可以考慮使用ThreadLocalAttribute。

3

這似乎是你試圖下載第二個文件先下載完成之前 - 與Web客戶端的同一個實例。創建WebClient的新實例應該可以解決這個問題。 CancelAsync()嘗試取消正在進行的下載,但它可能仍在運行一段時間。下載完成/取消後,會引發DownloadStringCompleted事件處理程序,允許您使用同一個WebClient實例開始新的下載。

0

您可以編寫一個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,這是在的try-catch塊處理,最後,你可以調用終於塊新的異步請求。你也可以把您在終於塊,以確認用戶是否有canceled操作,如果yes然後調用新的異步請求else什麼也不做。

我希望這是你正在尋找的。