winform中的多线程问题[不知该怎么弄了,请教]
公司让做一个实时监控的桌面软件
在mainform中有3个功能
1、每间隔一定时间采集一次监控数据;
2、每间隔一定时间将掉线的客户端服务器成列出来
3、每间隔一定时间将采集出来数据进行汇总显示出来
刚开始的想法觉得这个很简单,很容易实现,开几个多线程就行了
以第2条为例:
首先想到的是用System.Threading.Timer,功能很快就实现了,接着问题也出来了,如果设置的刷新
时间要是比程序的处理时间少的话,线程池很快就被耗尽。
为了解决这个问题,现在采用了invoke;
代码:
Thread Clientthread = null;
public MainForm()
{
Clientthread = new Thread(new ThreadStart(ShowClientServer));
Clientthread.IsBackground = true;
Clientthread.Start();
}
void ShowClientServer()
{
while (true)
{
ShowClient();
Thread.Sleep(_showInterval * 1000 * 60);
}
}
delegate void dshowClientData();
void ShowClient()
{
if (this.InvokeRequired)
{
this.Invoke(new dshowClientData(ShowClient));
}
else
{
showClientData();//将数据显示在mainform中
}
}
这样写也有个问题,当线程将数据返回到mianform中并将数据显示出来时,mainform会有一段假死现象
如果3个模块设置的刷新时间过短的话mianform基本一直假死了。
还有在MainForm_FormClosing、MainForm_FormClosed中如何关闭所有开启的线程
因为一直是做web开发的,对多线程不熟悉,觉得很难控制;
劳驾大牛们给个解决方案,最好附带简单示例,谢谢
------解决方案--------------------如果一个线程没有执行完毕,也不推荐你强制关闭它。你可以设置一个公共的bool字段,所有线程读取该字段,一旦发现为false,就停止处理直接结束,这样就达到了关闭线程的效果。
------解决方案--------------------建议你使用:quartz.net
自己写线程去控制是一件蛋很疼的事。