我眼中委托的真正面貌(三)
2009-05-14 08:28:38 来源:WEB开发网对比以上的两段代码,我们不难发现其中的差别,与上一段代码相比,我们在这里使用了BeginInvoke()的另一个重载方法。其中的一个参数即为BeginInvoke()方法指定的回调方法,在相应的目标方法执行完毕之后将调用该回调方法,并且可以在相应的回调用法中调用结束动作。
这里值得顺带一提的是,有关我写上一篇随笔时留下的关于Control.Invoke()方法的疑问。
大家可能会发现,本节中提到的[delegate].Invoke()方法与上节中提到的Control.Invoke()方法在名称书写上是一样的,那么他们在功能上是否存在着些许的相似之处呢?以下是我做出的总结:
Return Work Thread
Control.Invoke 完成工作 强制於 UI Thread
Control.BeginInvoke 立即 强制於 UI Thread
[delegate].Invoke 完成工作 Call Invoke 的 Thread
[delegate].BeginInvoke 立即 新的背景 Thread
从中大家可以发现一个关键的问题,不论委托对象也好,Control对象也好,他们的Invoke ()方法都是以绝对同步的方式执行,而BeginInvoke()方法则是以绝对异步的方式执行。
在这里,我之所以强调“绝对” 两个字,是为了提醒读者虽然“异步”与“多线程”间存在着密切的联系,但异步并不等于在原程序的基础上开设子线程,同步亦并非一定要针对单线程的程序而言。
我们不妨再以上一篇随笔中“跨线程操控控件”这段代码来说明问题,当然为说明问题方便,我做了部分调整:
更多精彩
赞助商链接