作者sd016808 (sd016808)
看板C_Sharp
标题[问题] 跨执行绪更新UI的问题
时间Sat Jan 30 01:38:46 2016
请问一下以下两种写法为何第一种在运行时视窗不能拖动,第二种视窗可以拖动。
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,没有父子的阶层关系?
------
| |
| 父 | while(true){} // if busy
|----|
-------
| |
| 子1 | Textbox更新 // 卡住不会动
|-----| // 是因为Textbox的拥有者是父Thread,所以更新要透过父
// Thread,但是它正在buzy,所以子Thread也卡住吗?
-------
| |
| 子2 | 基本的数学运算 // 正常运行
|-----| // 是因为没有需要透过父Thread处理的工作吗?
不好意思问题有点多,如果有C#处理UI的相关资料希望也可以推荐一下,谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.43.228.187
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1454089130.A.92B.html
1F:推 tvbic: 第一种写法 就跟没有用thread的效果一样 当然会卡了 01/30 02:26
2F:→ ssccg: 第一个是invoke一个长时间动作(loop)在ui thread 01/30 05:39
3F:→ ssccg: 第二个是在新thread跑loop,每次loop invoke一个短时间动作 01/30 05:40
4F:→ ssccg: 至於invoke动作在另一个thread上会不会卡住原本thread是看 01/30 05:43
5F:→ ssccg: invoke方法,用Invoke会等,用BeginInvoke就不等 01/30 05:44
6F:→ ssccg: 跟父子没有关系,thread没有父子关系 01/30 05:44
意思是说其实第二种写法等效於下面的Code吗?
public void Test()
{
for (int x = 0; x < 10000; x++)
{
ShowText(x);
}
}
public void ShowText(int x)
{
if (textBox1.InvokeRequired)
{
Action<int> obj = new Action<int>(ShowText);
this.Invoke(obj,x);
return;
}
textBox1.Text = x.ToString();
}
另外关於子Thread会不会被父Thread卡住的问题(使用invoke的方式),是不是应该说成
需要更新的控件的拥有线程是否堵塞比较好?
如果是这样,那麽要如何判断控件的拥有线程是哪一个?
例如这样:
void Create() // 主线程呼叫
{
Form2 frm = new Form2();
new Thread( ()=>{frm.ShowDialog();} ).Start(); // 支线程
}
此时的frm上的控件拥有者算是主线程还是支线程?
如果此时主线程执行while(true){},进入讯息堵塞的状态,
而frm的视窗是可以正常拖动的,所以拥有frm的是支线程而不是主线程?
但是frm不是在主线程被建构的吗?
※ 编辑: sd016808 (114.43.228.187), 01/30/2016 11:12:47
7F:→ sd016808: 关於最後的问题,是不是因为控件是在ShowDialog()後才被 01/30 11:16
8F:→ sd016808: 建立的,所以控件的所有权是属於支线程的,所以就算主线 01/30 11:17
9F:→ sd016808: 程讯息被堵塞,frm视窗不会受到影响。 01/30 11:18
11F:→ fanntone: 关键字: 同步 非同步 02/02 22:17