2012-12-14 44 views
2

我試圖更新TextBox.Text顯示從1到10與1秒的內部與下面的代碼。我不明白爲什麼文字更新爲10之前,我雖然Thread.sleep代碼(1000)應該屬於由Dispatcher.BeginInvoke創建一個獨立的後臺線程10秒,整個UI睡覺。如何在BeginInvoke Thread.Sleep

我的代碼有什麼問題?

Thread t1 = new Thread(new ThreadStart(
    delegate() 
    { 
     this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
      new Action(delegate() 
       { 
        for (int i = 1; i < 11; i++) 
        { 
         mytxt1.Text = "Counter is: " + i.ToString(); 
         Thread.Sleep(1000); 
        } 
       })); 

    })); 
t1.Start(); 
+0

你很可能不使用單獨的後臺線程。我很確定這一點,因爲如果你這樣做了,你會得到一個錯誤,說mytxt1是從一個不同的線程訪問的,而不是它創建的。如何解決這個問題?請參閱本教程:http://www.dreamincode.net/forums/topic/246911-c%23-multi-threading-in-a-gui-environment/ – 2pietjuh2

回答

2

設置文本的動作在用戶界面上運行,這就是UI凍結的原因。

由於只有創建UI控件實例的線程(又名UI線程)才能修改UI控件的屬性,所以必須運行在UI線程上設置文本的代碼。這就是你正在做的。

你可以嘗試的是讓代碼在Threading.Timer中運行。

或者......你已有的代碼,你應該有這樣的事情,它可能工作:

Thread t1 = new Thread(new ThreadStart(
delegate() 
{ 
    for (int i = 1; i < 11; i++) 
    { 
    this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
     new Action(delegate() 
      {       
        mytxt1.Text = "Counter is: " + i.ToString();       

      })); 
    Thread.Sleep(1000); 
    }    
})); 
t1.Start(); 
6

你的代碼創建新的線程只能迫使調度員到你的動作回同步到UI線程。我想你添加了Dispatcher.BeginInvoke,這是由於異常導致從另一個線程更改mytxt1.Text引起的。試試這個:

Thread t1 = new Thread(new ThreadStart(
    delegate() 
    { 
     for (int i = 1; i < 11; i++) 
     {   
      var counter = i; //for clouser it is important 
      this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
       new Action(delegate() 
       {      
        mytxt1.Text = "Counter is: " + counter.ToString();           
       })); 
      Thread.Sleep(1000); 
     } 
    }