VS建模调用说明

开发 后端
VS建模后台线程为了控制UI控件的状态后不需要等待,而是要继续往下处理,那么你就应该使用VS建模来进行异步处理。

VS建模是主线程消息队列相关的,发送给主窗体的消息才能发送到界面主线程消息队列。我们可以看到VS建模方法使用了同样的实现,只是VS建模方法的***一个参数值不一样。

如果你的后台线程需要操作UI控件,并且需要等到该操作执行完毕才能继续执行,那么你就应该使用Invoke。否则,VS建模在后台线程和主截面线程共享某些状态数据的情况下,如果不同步调用,而是各自继续执行的话,可能会造成执行序列上的问题,虽然不发生死锁,但是会出现不可预料的显示结果或者数据处理错误。

VS建模可以看到ISynchronizeInvoke有一个属性,InvokeRequired。VS建模这个属性就是用来在编程的时候确定,一个对象访问UI控件的时候是否需要使用Invoke或者BeginInvoke来进行封送。如果不需要那么就可以直接更新。在调用者对象和UI对象同属一个线程的时候这个属性返回false。在后面的代码分析中我们可以看到,Control类对这一属性的实现就是在判断调用者和控件是否属于同一个线程的。

Delegate.BeginInvoke
通过一个委托来进行同步方法的异步调用,也是.net提供的异步调用机制之一。但是Delegate.BeginInvoke方法是从ThreadPool取出一个线程来执行这个方法,以获得异步执行效果的。也就是说,如果采用这种方式提交多个异步委托,那么这些调用的顺序无法得到保证。而且由于是使用线程池里面的线程来完成任务,使用频繁,会对系统的性能造成影响。

Delegate.BeginInvoke也是讲一个委托方法封送到其它线程,从而通过异步机制执行一个方法。调用者线程则可以在完成封送以后去继续它的工作。VS建模但是这个方法封送到的最终执行线程是运行库从ThreadPool里面选取的一个线程。#t#

这里需要纠正一个误区,VS建模那就是Control类上的异步调用BeginInvoke并没有开辟新的线程完成委托任务,而是让界面控件的所属线程完成委托任务的。看来异步操作就是开辟新线程的说法不一定准确。

责任编辑:chenqingxiang 来源: 计世网
相关推荐

2009-12-16 09:40:19

VS环境

2009-12-11 14:01:10

VS 6.0

2009-12-18 11:41:08

VS 2008 fea

2009-12-11 13:49:39

VS Web服务

2009-12-14 09:09:35

VS 2008 Pro

2009-12-02 14:19:09

VS 2010产品

2009-12-15 17:20:07

VS 水晶报表

2009-12-04 13:20:03

VS2005安装

2009-12-14 13:52:54

VS 2005程序

2009-12-15 10:17:38

VS 2010软件

2009-12-09 16:33:28

VS Team Sys

2009-12-16 16:32:45

VS2008安装部署

2009-12-15 17:02:29

Vs.Net 2010

2009-12-14 15:27:20

VS2008程序

2009-11-30 15:57:18

VS2003 MFC

2009-12-10 13:11:47

VS2003安装

2009-12-11 16:39:59

VS 2008 XML

2009-12-11 14:38:06

VS2003安装程序

2009-12-11 15:38:40

VS2008编译器

2009-12-15 15:04:21

VS 2008特性
点赞
收藏

51CTO技术栈公众号