处理多线程程序时的陷阱物业
之前谈好的工作也将泡汤。“就觉得点燃这些东西是一种发泄 与所有的UI开发平台一样,.NET下线程开发图形界面同样要遵循一个基本原则:就是对UI对象的操作一定要在产生该UI对象的线程里进行(该线程称作UI线程),因为大部分UI对象都不是线程安全的。
在.NET中,把调用调用放在UI线程里执行是通过Form类及其子类的Invoke()方法实现的(具体的过程请参考其他资料),可以这样做是因为Form对象保存了创建它的线程的信息,而且Form类有一个bool类型的属性InvokeRequired,可以通过它查看当前线程是否为创建该Form对象的线程(UI线程)——如果为true,则表示当前线程不是UI线程,反之则是。下面提供一个例子:
using reading;
using rms;
namespace csharpTest
{
public class TestForm : Form
{
private Form form1;
private Form form2;
public static void Main()
{
TestForm tf = new TestForm();
ow();
Thread();
n();
}
public void UIThread()
{
form1 = new Form();
form2 = new Form();
ow();//这里是关键
ow();
Thread thread = new Thread(new ThreadStart(WorkerThread));
art();
}
public void WorkerThread()
{
if (vokeRequired)
voke(new MethodInvoker(WorkerThread));
else
{
xt = \"This is from WorkerThread.\";
}
}
protected override void OnClosing(ncelEventArgs e)
{
Closing (e);
it();
}
}
}
TestForm里有两个需要注意的方法,UIThread——用来模拟UI线程,WorkerThread——用来模拟用户线程,UIThread中实例化了成员form1与form2,并调用了它们的Show方法,在WorkerThread中改变form1的Text属性。请注意WorkerThread里有个技巧, if (vokeRequired) 即如果当前线程不是创建该form2的线程,则将方法通通过过Invoke方法放到UI线程里去执行。但就是这里问题出现了。form1和form2都是在UIThread里建立的,所以它们保存的线程的信息应该是一样的。所以vokeRquired和vokeRquired的值在任何线程里都是一样的,即在WorkerThread中InvokeRquire的值都应该是true(因为在不同的线程里)。但是如果注释掉ow()的话vokeRquired在WorkerThread中的值却是false(在中调试看到),怎么会这样呢?而且如果不经过判断直接在WorkerThread里调用form2对象的Invoke的话…………居然会抛出异常——“在创建窗口句柄之前,不能在控件上调用 Invoke 或 InvokeAsync”分析一下该异常的信息,在win32里每一个窗体都有一个窗体句柄,是该窗体在建立时系统分配的,但我们确实在UI线程里建立了form2对象的。这里有个误区.Net里的Form对象并不是和win32的窗体对象完全对应的。
本人窃以为,产生一个Form类的实例时,只是产生了一个内存中的普通的对象,并不产生系统窗体(好像叫做User对象吧),只有它第一次呈现在屏幕上(或称作创建)时,才产生系统里表示窗体的User对象且分配句柄,对应的WIN32 API的CreateWindow()方法大概也在这个时候执行(先声明:本人对WIN32 AP 并不熟悉,所以这里如果有什么不妥的话请大家指正)
只有.NET里的form对象调用某种方法使系统产生真正的窗体时,form才会有创建它的线程的信息,且InvokeRquired才有效,即才能调用form的Invoke方法。不过我还没弄清楚哪几个方法可以做到。据我所知Show, CreateGraphics可以产生系统真正的系统窗体。
成都治疗白癜风的医院长沙哪医院男科好
贵阳治疗妇科医院哪家好
- 女子痴迷减肥瘦到50斤致多器官衰竭,医师:她生完孩子对减肥更有执念,一年瘦了80斤
- 混迹职场多年,但是这些职场潜规则,你或许仍然不知道,别害了你
- 工厂用光排管涡轮
- 月内已交付7艘船!新大洋造船交付嘉航海运第2艘75000吨内贸散货船
- 《蛋仔派对》X水波蛋联动外观超萌迫近!朗朗晴天加载中......
- 杨鸣情商到底多高?蒋兴权录像懵了,郭士强都没做到
- 马力:钢铁行业面临的整体状况正在改善
- 这些“有颜色”的营养成分,对身体很重要!
- 四大名著若去除一本,你会选哪一本?网友选的竟不是红楼梦?
- 中央气象台:今年最大最强高温来袭!家中DIY这几款凉茶吧~
- 格纹复古裙的身着搭,总是更加优雅一些
- 猪蹄分“前后”,买错了肉质差白花钱,记起5点,不被肉贩忽悠