2011-05-20 64 views
-1

BackgroundWorker線程(以RunWorkerAsync()開頭)中,我想通過HttpWebRequest從服務器下載文件。只要我呼叫GetResponse(),從服務器下載文件時GUI仍然凍結。這實際上不應該發生,因爲BackgroundWorker與具有某些裝飾(如進度處理和取消)的線程差不多一樣。任何人都可以解釋爲什麼會發生這種情況嗎?在BackgroundWorker線程中下載文件時GUI凍結

下面的代碼片段:

  if ((lRequest = (HttpWebRequest)WebRequest.Create(lURL)) != null) 
      { 
       if ((lResponse = lRequest.GetResponse()) != null) 
       { 
        lRemoteStream = lResponse.GetResponseStream(); 
        lLocalStream = File.Create(lTempFileName); 

        do 
        { 
         lBytesRead = lRemoteStream.Read(lTemp, 0, lTemp.Length); 
         lLocalStream.Write(lTemp, 0, lBytesRead); 
        } while (lBytesRead > 0); 
       } 
      } 
+2

此代碼是什麼? – SLaks 2011-05-20 18:05:45

+1

你已經發布的代碼沒有問題,但它如何以及在哪裏被調用,可能會有問題,所以請發佈你如何調用此代碼的代碼。 – 2011-05-20 18:14:34

回答

1

需要看到更多的代碼來提供幫助。

我遇到類似問題的一種方式是,當我向用戶界面發送大量進度時,很快就會凍結它。所以雖然我的主要任務是在另一個線程上運行,但是我對UI的更新速度非常快,它對UI線程產生了負面影響。也許你在做類似的事情嗎?

與此同時
+0

陳述UI的+1無法跟上快速後臺任務。我的後臺應用程序更新進度條的速度超過了它的速度。 – 2011-05-20 21:01:37

0

我已經發現了這個問題,如果我已經聽了你的話,你有可能回答我的問題已經:/

如果你開始的BackgroundWorker線程要小心,你不回指向UI主線。只要我刪除了「InvokeRequired」凍結效應已經走了

private void BW_FriendInRequest_DoWork(object sender, DoWorkEventArgs e) 
    { 
     while (true) 
     { 
      if (this.isLoggedIn) 
       listIncomingRequests(); 

      Thread.Sleep(Config.mMessagesCheckSleep); 
     } 
    } 


    private delegate void listIncomingRequestsDelegate(); 
    private void listIncomingRequests() 
    { 
     if (InvokeRequired) 
     { 
      listIncomingRequestsDelegate d = new listIncomingRequestsDelegate(listIncomingRequests); 
      this.Invoke(d, new object[] { }); 
      return; 
     } 
     ... 
    } 

: 在我來說,我就是這麼做的。