Winform中的Control.Invoke&Control.BeginInvoke
2012-02-22 21:06 MichaelYin 阅读(320) 评论(0) 编辑 收藏 举报最近由于毕业论文的原因接触了下Winform,以前对于Control.BeginInvoke和delegate下的同样的方法的区别不是很清楚,这次借着这次机会把这个知识点好好补了一下。
先来说说Winform中的Control吧,Winform中的控件是运行在UI线程中的,而不是工作线程(可以通过InvokeRequired来进行判断是不是安全的),所以如果我们在工作线程中对其的属性进行修改的话,那么多线程的时候就会产生问题。所以微软是不建议这样操作的
那么如果我需要控件完成某个事情,我需要怎么做呢?这时候Control.Invoke的作用就体现出来了。这里需要注意的是有两个一个是Invoke,另外一个是BeginInvoke,那么这两者有什么区别呢?
如果后台工作线程需要对UI这个线程的方法调用进行等待那么就用Invoke,如果不需要等待,,当传入的方法执行完毕后工作线程继续执行的,那么就用BeginInvoke,两者的区别仅仅在于是否阻塞工作线程,而传入的方法其实都是在UI线程内执行的
而delegate的BeginInvoke其实是新开辟的一个线程,在这个新开辟的线程中执行这个方法
private void button1_Click(object sender, EventArgs e) { Func<string> func = () => { MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString()); return "asdf"; }; func.BeginInvoke(null, null); }
在VS中Debug/Windows/Threads可以查看运行的进程
http://www.cnblogs.com/yuyijq/archive/2010/01/11/1643802.html