C# 多线程操作界面时,使用Invoke与BeginInvoke的区别
2014-10-24 15:43
507 查看
Invoke方法的参数很简单,一个委托,一个参数表(可选),而Invoke方法的主要功能就是帮助你在 UI线程(即创建控件的线程)上调用委托所指定的方法。Invoke方法首先检查发出调用的线程(即当前线程)是不是UI线程,如果是,直接执行委托指向 的方法,如果不是,它将切换到UI线程,然后执行委托指向的方法。不管当前线程是不是UI线程,Invoke都阻塞直到委托指向的方法执行完毕,然后切换 回发出调用的线程(如果需要的话),返回。注意,使用Invoke方法时,UI线程不能处于阻塞状态。
BeginInvoke,毫无疑问这是Invoke的异步版本 (Invoke是同步完成的),不过大家不要和上面的System.Windows.Forms.MethodInvoker委托中的 BeginInvoke混淆,两者都是利用不同线程来完成工作,但是控件的BeginInvoke方法总是使用UI线程,而其他的异步委托调用方法则是利 用线程池里的线程。相对Invoke而言,使用BeginInvoke稍稍麻烦一点,但还是那句话,异步比同步效果好,尽管复杂些。比如同步方法可能出现
这样一种死锁情况:工作者线程通过Invoke同步调用UI线程里的方法时会阻塞,而万一UI线程正在等待工作者线程做某件事时怎么办?因此,能够使用异 步方法时应尽量使用异步方法。
BeginInvoke,毫无疑问这是Invoke的异步版本 (Invoke是同步完成的),不过大家不要和上面的System.Windows.Forms.MethodInvoker委托中的 BeginInvoke混淆,两者都是利用不同线程来完成工作,但是控件的BeginInvoke方法总是使用UI线程,而其他的异步委托调用方法则是利 用线程池里的线程。相对Invoke而言,使用BeginInvoke稍稍麻烦一点,但还是那句话,异步比同步效果好,尽管复杂些。比如同步方法可能出现
这样一种死锁情况:工作者线程通过Invoke同步调用UI线程里的方法时会阻塞,而万一UI线程正在等待工作者线程做某件事时怎么办?因此,能够使用异 步方法时应尽量使用异步方法。
相关文章推荐
- c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
- C#中Invoke与BeginInvoke的区别(另附使用循环创建多个线程)
- C#中Invoke 和 BeginInvoke 的区别(多线程调用Winform)
- C# Invoke的使用以及与BeginInvoke的区别
- c# Invoke和 BeginInvoke的区别 ,在SerialPort 中使用方式
- C#的Invoke和BeginInvoke、多线程中的界面更新
- c# Invoke和BeginInvoke 区别
- c# Invoke和BeginInvoke 区别
- C# 为什么使用了多线程界面假死?
- c# Invoke和BeginInvoke 区别
- [转]C# Invoke和BeginInvoke的区别
- 引用 c# Invoke和BeginInvoke 区别
- c# Invoke和BeginInvoke 区别
- c# Invoke和BeginInvoke 区别
- C# 为什么使用了多线程界面假死?
- c# Invoke和BeginInvoke 区别
- C#用委托(Delegate)的BeginInvoke和EndInvoke方法操作线程
- 在WinFrom应用中,如果使用后台线程来操作界面应调用Control.Invoke()方法
- c# Invoke和BeginInvoke 区别
- C#多线程与界面操作