2015-01-08 38 views
0

我正在研究一個工業Web模塊,它必須異步登錄到Web服務器,並稍後發送小數據請求。 首先,我發送GET請求來接收會話cookie,然後發送帶有UN和PW的POST請求。 我想使用HttpWebRequest類中的BeginGetRequestStream和BeginGetResponse方法。但是,如果您從下面的MSDN中讀取引號,則會提到某些部分不是異步的。如何使BeginGetRequestStream和BeginGetResponse真的異步?

我該如何處理這個問題的最佳方式?我是否應該完全避免使用這些方法,還是應該構建一個自動防故障機制,以防萬一方法花費太長時間纔會跳過代碼(如果甚至可能的話)? 編碼工作不是問題,重要的是確保我的模塊是真正的異步並且永遠不會阻塞主程序。

謝謝!

的BeginGetRequestStream方法需要一些同步設置任務 完成(DNS解析,代理檢測,並且TCP套接字 連接,例如)之前該方法變得異步的。作爲 結果,應始終不要在用戶界面(UI) 線程上調用此方法,因爲它可能需要相當長的時間(取決於網絡設置,可能需要幾分鐘的時間才能完成初始同步 設置任務)錯誤被拋出或方法 成功。

的BeginGetResponse方法需要一些同步設置任務給 完成(DNS解析,代理檢測,並且TCP套接字連接, 例如)之前該方法變得異步的。因此, 不應在用戶界面(UI)線程 上調用此方法,因爲可能需要花費相當長的時間(最長爲幾分鐘,具體取決於網絡設置),以在完成初始同步 安裝任務之前錯誤被拋出或方法 成功。

+1

你爲什麼不使用'HttpClient'?它完全「異步」,它支持基於任務的編程模型 –

+0

奧哈,感謝您的信息。有沒有更多完全不同的方法?在我花費大量時間使用方法之前,我想了解一些關於它們的知識(不幸的是,我已經花時間去了HttpWebRequest,但我想這也是花時間學習VB的時間:) – Comodorewaran

+0

例如,等待和異步? – Comodorewaran

回答

0

正如我在評論中提到的,我會使用HttpClient然後您可以使用async-await。這裏是一個例子

private async Task DownloadUrlAsync(string url) 
{ 
    HttpClient httpCLient = new HttpClient(); 
    textBox1.Text = await httpCLient.GetStringAsync(url); 
} 
+0

感謝這個例子,我看到HttpClient和Await/Async是4.5的一部分。我目前正在使用4.0,你認爲有一種方法可以挽救我目前的項目,儘管BeginGetResponse部分是同步的,但它以某種方式使它失效保護。比如在開始Stream/Request之前試圖連接服務器?或者,我可以放棄這些迂迴路線並使用HttpClient方法來更好嗎? (雖然這取決於我的公司可以使用4.5) – Comodorewaran

+0

更好的選擇可能是WebClient http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.110%29。 aspx –

+0

來自MSDN:WebClient使用WebRequest和WebResponse類來建立到Internet資源的實際連接....和.... WebClient類使用WebRequest類來提供對資源的訪問。那麼這不會讓WebClient成爲具有相同底層問題的更「抽象」的方法嗎? – Comodorewaran