WEB开发网
开发学院软件开发C语言 我眼中委托的真正面貌(二) 阅读

我眼中委托的真正面貌(二)

 2009-05-07 08:26:49 来源:WEB开发网   
核心提示: 编译运行,你会发现程序顺利的通过了,我眼中委托的真正面貌(二)(7),对比上一段代码,应该很容易发现,而在此之后,程序跳过了if模块而直接进入else模块,这一段代码在上一段代码的基础上新增了委托的定义,再就是关键的SetText()方法

编译运行,你会发现程序顺利的通过了。对比上一段代码,应该很容易发现,这一段代码在上一段代码的基础上新增了委托的定义,再就是关键的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()方法被作为主线程的方法调用。

上一页  2 3 4 5 6 7 8  下一页

Tags:眼中 委托 真正

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接