Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2314608
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-07-07 07:51:25

在一个工具类的程序中, 需要保存较大的XML文件, 为了保证文件内容的正确性, 加入了XML-schema检查和一些额外的语义检查, 但检查拖慢了保存文件的过程, 为了让用户知道程序在干活而不是死了, 我把保存的动作放入了一个额外的线程中去做, 在主UI界面上显示一个动画image表明正在保存文件.

一旦在基于WinForms程序中引入worker线程, 迟早会自己碰到在非UI线程中企图直接调用Control相关的函数, Property等等, 这在Windows中, .NET诞生之前就已经决定了是非法的.

但是, 并不能简单地把访问Control的代码通过delegate + Control.Invoke调用了事. Invoke调用的其中一个前提是控件已经创建, 在ctor 直接或间接调用的函数中, 这一条件并不满足, 所以, 调用 Control.Invoke的一个安全的前条件是:
if( ctrl.IsHandleCreated && ctrl.RequireInvoke)
{
   ctrl.Invoke(...);
}

RequireInvoke可以避免不需要Invoke时不必要的开销.
阅读(1079) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~