您的位置:首页 > 其它

Winform中的Control.Invoke&Control.BeginInvoke

2012-02-22 21:06 357 查看
最近由于毕业论文的原因接触了下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可以查看运行的进程

/article/4700503.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: