代码改变世界

Winform中的Control.Invoke&Control.BeginInvoke

2012-02-22 21:06 MichaelYin 阅读(...) 评论(...) 编辑 收藏

最近由于毕业论文的原因接触了下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