2013-10-07 66 views
2

在一個移動設備(Windows Mobile)的程序中,我使用緊湊框架3.5, 我下載一個文件並希望通過在Windows中顯示它來監視進度.Forms.Label。緊湊框架:更新線程中的標籤不工作

這裏我的代碼:

我的線程開始(在一個按鈕單擊事件)

ThreadStart ts = new ThreadStart(() => DownloadFile(serverName, downloadedFileName, this.lblDownloadPercentage)); 
Thread t = new Thread(ts); 
t.Name = "download"; 
t.Start(); 
t.Join(); 

我的線程方法

static void DownloadFile(string serverName, string downloadedFileName, Label statusLabel) 
{ 
     HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(serverName); 
     do 
     { 
      //Download and save the file ... 
      SetPercentage(statusLabel, currentProgress); 
     } while(...) 
} 

的方法更新標籤文本

private static void SetPercentage(Label targetLabel, string value) 
{ 
     if (targetLabel.InvokeRequired) 
     { 
      targetLabel.Invoke((MethodInvoker)delegate 
      { 
       targetLabel.Text = value; 
      }); 
     } 
     else 
     { 
      targetLabel.Text = value; 
     } 
} 

下載和保存部分工作正常,但是當談到targetLabel.Invoke-part(第3代碼片段)時,程序將停止執行任何操作。沒有崩潰,沒有錯誤信息,沒有例外。它只是停止。

這裏怎麼回事?

順便說一句,如果我離開了t.Join()的距離,該線程不啓動在所有...(爲什麼呢?)

回答

2

敢肯定你會得到一個DeadLock這裏。

主線程正在等待t.Join();然後當工作線程調用targetLabel.Invoke主線程無法調用它,因爲它正在等待Join這是永遠不會發生的。這種情況在計算機科學中被稱爲Deadlock

刪除Join()它應該工作。

順便說一句,如果我離開了t.Join()的距離,該線程不啓動在所有...(爲什麼呢?)

不知道那是什麼,是不是它應該是怎麼樣的,嘗試調試應用程序並找出它。如果找不到,請提供更多信息以獲得幫助。

希望這會有所幫助