目前,我除自己为客户开发项目外,也要诊断一些客户的程序,因为他们在使用我们公司提供的开发包。
一些程序为了提供多线程支持,经常使用的是消息,timer,thread.
消息:
利用窗口消息泵来实现线程间通信。因为消息泵是针对UI线程的容器,所以可以理解成在UI线程上同步。
好处是,程序相对清晰明了,通过消息名称,很容易查到处理过程;
问题是,计算量大时,需要注意消息频率,否则造成界面假死。
timer:
目前,大多是用form timer。
好处是,自动循环触发。
问题是,客户经常忽略timer间隔变化问题。如果间隔时间很小,有可能kick事件触发的函数没有运行完,新的事件又被触发过来。最简单的方法是在触发处理函数上,stop timer ,结束前再启动timer。
thread:
好处是,时间和空间一切由自己管理。
问题是,第一要注意同步,第二是怎样调用UI控件方法。
public void changeStatus()
{
if (this.InvokeRequired) //true:当前是自建的线程; false:直接操作吧资源本来就是你的。
{
//我知道该方法不是我实现的也不需要我实现,我要操控控件,就让控件自己去做吧。
this.Invoke(new MethodInvoker(this.changeStatus)); //调用UI控件的方法。
return;
}
progressBar1.Value = _progrssStatus;
label1.Text = _progrssStatusinfo;
}
很难看是吧?我在自己的工程中使用过1次,就再没用过。