2012-09-05 30 views
0

可能重複:
Execute a WebRequest in a Background thread while UI Thread is blockedDownloadStringAsync需要UI線程?

看看這個代碼:

Thread t = new Thread((a) => 
    { 
     var client = new WebClient(); 

     client.DownloadStringAsync(new Uri("http://www.google.com")); 

     bool pointB = true; 
    }); 

t.Start(); 
t.Join(10000); 

當這是在Silverlight UI線程上運行,即使DownloadStringAsync()被調用很快,在Join()超時之後,pointB將不會被觸及。這意味着DownloadStringAsync()必須以某種方式要求UI線程完成其工作。 注意:這與回調到DownloadString無關。我知道WebClient的回調發生在UI線程上(請參閱:Silverlight Background Thread using WebClient)。

我的代碼的行爲似乎表明,異步調用方法本身(DownloadStringAsync())也需要UI線程。是對的嗎?如果是這樣,爲什麼?我也想指出此相同的行爲使用HttpWebRequest.BeginGetResponse()

編輯時表現:把事情一清二楚,操作我看時,我通過這個代碼步驟的順序是

  1. t.Start()
  2. t.Join(10000);
  3. var client = new WebClient();
  4. client.DownloadStringAsync(new Uri(「http://www.google.com」)); (加入()超時)
  5. bool pointB = true;
+0

你是說加入超時? – McAden

+0

Join()超時,然後緊接在pointB之後。 – JoeCool

回答

1

好的,我想我多挖了一點後就想出了答案。它似乎確實是所有的網絡代碼最終在UI線程上運行: http://nondestructiveme.com/2010/11/23/silverlight-and-networking-the-ui-thread/

好消息是它似乎微軟修復這個「錯誤」,因爲你可能在調用它是合理的,在Silverlight 5: http://msdn.microsoft.com/en-us/library/gg986857(VS.95).aspx

(在頁面下的性能改進底部: 「通過使用網絡後臺線程減少網絡延遲,這對於那些使用客戶端的HTTP Web請求的情況有幫助」)

我將修改這個答案一旦我在Silverlight 5上測試我的代碼,看看它是否確實解決了問題。

編輯:建立對Silverlight 5,我仍然有同樣的問題。我認爲是時候放棄嘗試阻止UI線程了......