首先,什么样的操作需要考虑使用多线程?
总的一条就是,负责与用户交互的线程(以下简称为UI线程)应该保持顺畅,当UI线程调用的API可能引起阻塞时间超过30毫秒时(比如访问CD-ROM等速度超慢的外设、进行远程调用等等)就应该考虑使用多线程。
为什么是30毫秒?30毫秒的概念是人眼可以察觉到的一个迟滞,大约等同于电影里的一帧停留的时间,最长不要超过100毫秒。
第二,最方便和简单的多线程是使用线程池。
通过线程池里的线程运行代码的最简便方法则是使用异步委托调用。注意委托调用通常是同步完成的,请使用BeginInvoke方法,这样就可以把要调用的方法排队到线程池里等候处理,而程序的流程会立刻返回到调用方 (此处是UI线程),而调用方因此不会出现阻塞。
看看下面的例子,我们就发现要使用线程池异步执行代码也并非十分复杂,这里我们利用 System.Windows.Forms.MethodInvoker委托进行异步调用。注意MethodInvoker委托不接受方法参数,如果需要向异步执行的方法传递参数,请使用其他委托,或者需要自己定义。
privatevoidStartSomeWorkFromUIThread () {//我们要做的工作相对UI线程而言太慢了,用下面的方法异步进行处理MethodInvoker mi=newMethodInvoker(RunsOnWorkerThread);//这是入口方法mi.BeginInvoke(null,null);//这样就不会阻塞}//缓慢的工作在此方法内进行处理,使用线程池里的线程privatevoidRunsOnWorkerThread() {
DoSomethingSlow();
}归纳上述方法,对UI线程而言实际上