处理WinForm多线程程序时的陷阱[4]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 leonlux 的 blog

         {

              base.onclosing (e);

              application.exit();

         }

     }

}

testform里有两个需要注意的方法,uithread——用来模拟ui线程,workerthread——用来模拟用户线程,uithread中实例化了成员form1form2并调用了它们的show方法,在workerthread中改变form1text属性。请注意workerthread里有个技巧, if (form2.invokerequired) 即如果当前线程不是创建该form2的线程,则将方法通通过过invoke方法放到ui线程里去执行。但就是这里问题出现了form1form2都是在uithread里建立的,所以它们保存的线程的信息应该是一样的。所以form1.invokerquiredform2.invokerquired的值在任何线程里都是一样的,即在workerthreadinvokerquire的值都应该是true(因为在不同的线程里)。但是如果注释掉form2.show()的话form2.invokerquiredworkerthread中的值却是false(在vs.net中调试看到),怎么会这样呢?而且如果不经过判断直接在workerthread里调用form2对象的invoke的话…………居然会抛出异常——“在创建窗口句柄之前,不能在控件上调用 invoke invokeasync

分析一下该异常的信息,在win32里每一个窗体都有一个窗体句柄,是该窗体在建立时系统分配的,但我们确实在ui线程里建立了form2对象的。这里有个误区.net里的form对象并不是和win32的窗体对象完全对应的。本人窃以为,产生一个form类的实例时,只是产生了一个内存中的普通的对象,并不产生系统窗体(好像叫做user对象吧),只有它第一次呈现在屏幕上(或称作创建)时,才产生系统里表示窗体的user对象且分配句柄,对应的win32 apicreatewindow()方法大概也在这个时候执行(先声明:本人对win32 ap 并不熟悉,所以这里如果有什么不妥的话请大家指正)

本文关键:处理WinForm多线程程序时的陷阱
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top