winform中的多线程有关问题[不知该如何弄了,请问]

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

自己写线程去控制是一件蛋很疼的事。