2014-09-22 69 views
0

我使用按鈕和文本框的形式。 Button正在啓動正在更新文本框值的線程。線程更新GUI在隨機時刻凍結

public Form1() 
    { 
     InitializeComponent(); 
     myDelegate = new UpdateUi(updateUi); 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     myThread = new Thread(new ThreadStart(ThreadFunction)); 
     myThread.Start(); 
    } 
    private void ThreadFunction() 
    { 
     MyThreadClass myThreadClassObject = new MyThreadClass(this); 
     myThreadClassObject.Run(); 
    } 
    private void updateUi(int i) 
    { 
     textBox1.Text = i.ToString(); 
     Thread.Sleep(1000); 
    } 
    public Thread myThread; 
    public delegate void UpdateUi(int i); 
    public UpdateUi myDelegate; 

和ThreadClass:

public class MyThreadClass 
{ 
    Form1 myFormControl1; 
    public MyThreadClass(Form1 myForm) 
    { 
     myFormControl1 = myForm; 
    } 

    public void Run() 
    { 
     // Execute the specified delegate on the thread that owns 
     // 'myFormControl1' control's underlying window handle. 
     for(int i=0;i<100;i++) 
     { 
      if(myFormControl1.InvokeRequired) 
      { 
       myFormControl1.Invoke(myFormControl1.myDelegate,i); 
      } 

     } 


    } 
} 

正如你可以看到有沒有什麼特別的,我的代碼,但有時代碼凍結。

例如它會出現1-> 2-> 3-> freeze-> 16-> 17等等。

我把代碼HERE很少修改

+1

示例中的'Thread.Sleep'只是爲了減慢速度。你不需要那麼簡單,只需將它從代碼中移除即可。 – 2014-09-22 10:54:26

+0

那麼你告訴我'Thread.Sleep'是造成這種奇怪的行爲的原因嗎? – szpic 2014-09-22 10:59:09

+0

他需要它才能看到'textBox1'中的數字。 – GeorgeChond 2014-09-22 11:00:14

回答

1

的問題是,你正在拖延UI線程不是過程本身,以便發生的事情是你發出的所有更新命令,但因爲它在同一個線程它在所有運行因爲Thread.Sleep停止UI線程,所以它運行一堆textBox1.Text = i.ToString();然後它停止在所有的Thread.Sleep(1000);所有的時間可能是1-> 2-> 3的數量......你看到的是等於核心數量在你的機器上。

當你停止運行方法時,你會發出一個立即運行的更新命令並等待一秒鐘,直到你發出下一個命令,我認爲它正在嘗試完成。