我眼中委托的真正面貌(二)
2009-05-07 08:26:49 来源:WEB开发网编译运行,你会发现程序顺利的通过了。对比上一段代码,应该很容易发现,这一段代码在上一段代码的基础上新增了委托的定义,再就是关键的SetText()方法。
那么,大家不妨来分析一下这个方法的代码内容:
TreadDelgate Objdelegate = new TreadDelgate(SetText); 这一句当然是声明委托对象实例。
比较难理解的可能是 this.textBox1.InvokeRequired ,当目标控件textBox1将要被其他的子线程操控时,其相应的InvokeRequired 属性值即为真。
另外一句this.Invoke(Objdelegate, new object[] {}); 查一下MSDN文档,它的意思是:在拥有控件的基础窗口句柄线程上,用指定的参数列表执行指定的委托。
看明白意思了吧,呵呵…… 这几句代码所实现得功效贯穿下来就可以描述为——如果目标控件textBox1 将要被其他线程操控,就自动创建主线程的委托,并用它挂载SetText()方法,然后以子线程控制主线程端以委托执行相应的方法。
在这里,我想阐述一下自己的一点见解:
如果你试着在SetText()方法中下一个断点,同时跟踪一下代码的运行方式的话,便不难发现SetText()方法的调用顺序是这样的:程序首先进入if模块,而后凭借委托重新对方法进行调用,当再次进入方法的调用时,程序会直接跳过if模块而直接进入else模块。我认为,这里应该涉及到一个方法相对于线程的归属问题:
根据属性Control. InvokeRequired在MSDN中的解释,我们可以获悉,第一次调用SetText()方法时,C#的编译器实际上是将这个方法作为隶属于子线程的一个方法来看待,所以,this.textBox1.InvokeRequired的返回值才为true。而在此之后,程序跳过了if模块而直接进入else模块,说明此时SetText()方法被作为主线程的方法调用。
更多精彩
赞助商链接