代码改变世界

.NET Compact Framework 线程与界面上的控件

2008-03-04 18:19  cppguy  阅读(1038)  评论(6编辑  收藏  举报

要实现这样的功能:

    点击加载,跳出一个加载进度窗体,窗体上面的进度条在不停的动,加载完毕后,本窗体自动关闭。

    很容易联想到启用一个分线程,启动进度窗体,加载完毕后,我在主线程中想手动关闭 prg.close(),得到的结果是错误,线程访问了非法资源。

    其实在桌面.net framework和.net cf都不支持让用户界面不属于的线程访问他们的大多数属性和方法。虽然代码可以编译执行,但结果将不可预测。为了允许在线程间互相调用,他们提供了一个Control.Invoke()的方法。

  在后台线程和用户界面线程之间通信数据的一个合理和简单的方法就是在用户界面线程上运行代码周期性地轮询你专门设计的管理后台线程的对象,了解是否有用户界面需要的数据。通常这样做要比深入研究交叉线程调用方法的复杂特征容易的多。

   第二种方法是使用一个指向你应用窗口上函数的回调代理。在你的窗口类中一个函数能指定并且这个函数能通过窗口Invoke()方法调用。对Invoke()的调用将使函数在用户界面线程中执行。这样这个就可以获得它需要的任何数据并且同步更写用户界面。这个方法的好处是前台线程并不需要轮询并且在后台线程工作完成时可以马上接受更新。