[問題] 跨執行緒更新UI的問題

作者: sd016808 (sd016808)   2016-01-30 01:38:46
請問一下以下兩種寫法為何第一種在運行時視窗不能拖動,第二種視窗可以拖動。
private void button2_Click(object sender, EventArgs e)
{
new Thread(Test).Start();
}
1.視窗會被卡死
public void Test()
{
if (textBox1.InvokeRequired)
{
Action obj = new Action(Test);
textBox1.Invoke(obj);
return;
}
for (int x = 0; x < 100000; x++)
{
textBox1.Text = x.ToString();
}
}
2.視窗不會被卡死
public void Test()
{
for (int x = 0; x < 100000; x++)
{
textBox1.Invoke(new Action(() => {textBox1.Text = x.ToString();}));
}
}
另外還有幾個觀念想請問一下,C#的Message loop會不會因為父Thread忙碌造成子Thread
也卡住? 還是每一個Thread都有自己的message loop,沒有父子的階層關係?
作者: tvbic   2016-01-30 02:26:00
第一種寫法 就跟沒有用thread的效果一樣 當然會卡了
作者: ssccg (23)   2016-01-30 05:39:00
第一個是invoke一個長時間動作(loop)在ui thread第二個是在新thread跑loop,每次loop invoke一個短時間動作至於invoke動作在另一個thread上會不會卡住原本thread是看invoke方法,用Invoke會等,用BeginInvoke就不等跟父子沒有關係,thread沒有父子關係
作者: sd016808 (sd016808)   2016-01-30 11:16:00
關於最後的問題,是不是因為控件是在ShowDialog()後才被建立的,所以控件的所有權是屬於支線程的,所以就算主線程訊息被堵塞,frm視窗不會受到影響。
作者: fanntone (我是胖子)   2016-02-02 22:17:00
http://tinyurl.com/goho4n9關鍵字: 同步 非同步

Links booklink

Contact Us: admin [ a t ] ucptt.com