多线程与工作流一文中将多线程设计思路与工作流设计思路进行了一下对比,突然想到了这个问题,就顺手发上来了
在开发WF的宿主程序中,我们或多或少的会用到多线程,如果宿主是WinForm程序,也有可能会用到跨线程访问UI控件的需要
看一下在NET1.1中的线程访问UI控件
private void button1_Click(object sender, System.EventArgs e) { System.Threading.ThreadStart s =new System.Threading.ThreadStart(work); System.Threading.Thread obj = new System.Threading.Thread(s); obj.Start(); }
void work() { textBox1.Text = "1"; } |
上段代码在NET1.1中没有什么问题,可在NET2.0中,默认,UI控件只能由创建该控件的线程访问,所以上段代码在NET2.0中会报一个跨线程访问UI控件的异常。
看一下在NET2.0中如何实现上面的功能
delegate void 委托(object v);
void work2(object o) { 委托 x = new 委托(中介程序); this.Invoke(x, o); }
void 中介程序(object v) { textBox1.Text = v.ToString(); } private void button2_Click(object sender, EventArgs e) { System.Threading.Thread obj = new System.Threading.Thread(work2); obj.Start("1"); } |