在一个工具类的程序中, 需要保存较大的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时不必要的开销.
阅读(1113) | 评论(0) | 转发(0) |