2012-03-13 120 views
0

我有以下工作代碼從URL中獲取流:我是否遇到線程限制?

private Stream GetDownloadStream(string url) 
{ 
    Stream stream = null; 

    AutoResetEvent downloadCompleted = new AutoResetEvent(false); 
    httpRequest = (HttpWebRequest)WebRequest.Create(url); 

    httpRequest.AllowReadStreamBuffering = false; 
    httpRequest.BeginGetResponse(
     result => 
     { 
      try 
      { 
       httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(result); 
       stream = httpResponse.GetResponseStream(); 
      } 
      catch (WebException) 
      { 
       downloadCompleted.Set(); 
       Abort(); 
      } 
      finally 
      { 
       downloadCompleted.Set(); 
      } 
     }, 
     null); 

    bool completed = downloadCompleted.WaitOne(15 * 1000); 
    if (completed) { 
     return stream; 
    } 
    return null; 
} 

不要緊,我選擇地播放流。它始終爲前6個請求返回一個流,並在七個請求中返回null。

我已經嘗試將超時時間增加到30秒,但第七次請求時它不會輸入httpRequest.BeginGetResponse回調。

任何想法爲什麼?

+1

不知道是什麼問題,但對操作系統的限制似乎相當合理!請記住:這是一款移動設備,具有有限的電池,內存,處理能力和(通常)每個Kb支付的互聯網計劃! – 2012-03-13 13:06:06

+0

我假設你正在使用Visual Studio。如果是這樣,您可以通過暫停應用程序並打開線程窗口來查看哪些線程正在運行。 (我不在Windows PC上,所以不能告訴你確切的名字以及如何到達這個窗口)。我之前已經處理過線程問題,並且從我記得您有1個GUI /主線程和25個後臺線程處理線程問題。聽起來你應該有足夠的能力來完成這項任務。檢查您的應用當前正在運行多少個線程,並讓我們知道您是否全部使用它們。否則,這是另一個問題。 – ajmccall 2012-03-13 13:23:29

回答

2

您正在達到併發Web請求數(即6個)的限制。

嘗試關閉流,當你完成它或錯開你的請求,以便你不想一次做太多。

+0

我正在關閉和處理流並關閉httpResponse。我忘了放棄WebRequest。謝謝 – dcarneiro 2012-03-13 14:28:08