软件界面的响应特性是判断一款软件的非常重要的方面。一般来说,不管你软件功能做得
有多么奇妙,如果软件有一点点死机的感觉都会让用户感到很讨厌,甚至怀疑你软件里是
否藏有更大的问题。
要提高界面的响应特性,最好的办法莫过于使用多线程,并把呈现界面的线程独立出来。
以前只有使用 C++才能实现的多线程功能,现在在.Net 框架下,所有的语言(包括 VB)都可
以使用了。不过,使用多线程比使用单一线程要麻烦得多,比如线程之间的同步问题,做
得不好很容易出错,而有的时候这种错误要开发人员花上几个星期的时间才能找到。在
Windows Form 软件中使用多线程更是有一些限制。
下面我们就把在 Windows Form 软件中使用多线程要注意的问题给大家做一个介绍。
首•
先,什么样的操作需要考虑使用多线程?总的一条就是,负责与用户交互的线程(以下简称
为 UI 线程)应该保持顺畅,当 UI 线程调用的 API 可能引起阻塞时间超过 30 毫秒时(比如访
问 CD-ROM 等速度超慢的外设、进行远程调用等等)就应该考虑使用多线程。为什么是 30
毫秒?30 毫秒的概念是人眼可以察觉到的一个迟滞,大约等同于电影里的一帧停留的时间,
最长不要超过 100 毫秒。
第二,最方便和简单的多线程是使用线程池。通过线程池里的线程运行代码的最简便方
法则是使用异步委托调用。注意委托调用通常是同步完成的,请使用 BeginInvoke 方法,
这样就可以把要调用的方法排队到线程池里等候处理,而程序的流程会立刻返回到调用方
(此处是 UI 线程),而调用方因此不会出现阻塞。
看看下面的例子我们就发现要使用线程池异步执行代码也并非十分复杂,这里我们利用
System.Windows.Forms.MethodInvoker 委托进行异步调用。注意 MethodInvoker 委托不
接受方法参数,如果需要向异步执行的方法传递参数,请使用其他委托,或者需要自己定
义。
private void StartSomeWorkFromUIThread () {
// 我们要做的工作相对 UI 线程而言台慢了,用下面的方法异步进行处理
MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread);//这是入口方法
mi.BeginInvoke(null, null); // 这样就不会阻塞
}
// 缓慢的工作在此方法内进行处理,使用线程池里的线程
private void RunsOnWorkerThread() {
DoSomethingSlow();
}