[问题] 跨执行绪更新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