2013-01-21 70 views
4

我在某頁的LoadState方法中做異步請求。我使用HttpClient發出請求,並期待splashscreen在我等待結果時消失。WinRT HttpClient塊splashdrop

如果我沒有連接到任何網絡,splashscreen會立即消失,我得到一個空白頁面,因爲請求顯然沒有發生。

但是,如果我連接到網絡,但有連接問題(例如,我設置了錯誤的IP地址),它似乎開始請求,只是阻止。

我的期望是,HttpClient會意識到它不能發送請求,並拋出異常或只是返回一些東西。

我設法通過設置大約800毫秒的超時來解決阻塞問題,但是現在在Internet連接正常時它不能正常工作。這是最好的解決方案,我應該設置超時嗎?什麼是適當的超時,這將使我能夠區分一個無限期阻塞的呼叫和恰好在較慢網絡上的正確呼叫?

我也許可以檢查每個請求之前的互聯網連接,但是這聽起來像一個不可預知的解決方案...

編輯:現在,它真的很有趣。我曾試圖再次,它的塊在這一點上:

var rd = await httpClient.SendAsync(requestMsg); 

如果我使用作爲意見建議,並得到一個新的線程Task.Run(),那麼它總是很好。 但沒有Task.Run()如果沒有Internet訪問,但網絡訪問不是「有限」,它也沒有問題(它說IPv4連接是「Internet訪問」,雖然我無法在瀏覽器中打開單個網站,也沒有數據是從Web服務返回的,它只是拋出System.Net.Http.HttpRequestException,這是我期待的第一個地方)當網絡連接有限時纔會阻塞。

+1

如何發出請求?也許你用這種方式阻止了UI線程?你可以嘗試從後臺線程開始它,例如。使用'Task.Run()'? –

+0

謝謝,我試了一下,並編輯了我的問題了一些更多的細節。 –

+0

看看我的答案在類似的問題,它可能不會滿足你,但會給出這個問題的可能原因http://stackoverflow.com/questions/14526761/await-blocks-the-ui-thread/14530929# 14530929 – DVD

回答

1

如果不是設置超時,你檢查什麼用

public static bool IsConnected 
    { 
     get 
     { 
      return NetworkInformation.GetInternetConnectionProfile() != null; 
     } 
    } 

這樣,如果IsConnected,那麼你撥打電話的連接狀態;否則,忽略它。

我不確定你是否在App.xaml.cs中運行這個?我發現在該類中創建的請求可能會變幻莫測,將功能轉移到擴展啓動屏幕以確保應用程序完成整個激活過程可能是最好的選擇。

http://msdn.microsoft.com/en-us/library/windows/apps/xaml/Hh868191(v=win.10).aspx

+0

我確實檢查互聯網連接,但它仍然發生,它很奇怪,很難重現。 –