winform中的多线程问题[不知该怎么弄了,请教]

yqlvcxl_2007 2013-08-22 12:33:42
公司让做一个实时监控的桌面软件


在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开发的,对多线程不熟悉,觉得很难控制;

劳驾大牛们给个解决方案,最好附带简单示例,谢谢
...全文
150 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yqlvcxl_2007 2013-08-23
  • 打赏
  • 举报
回复
受教了,非常感谢
  • 打赏
  • 举报
回复
建议你使用:quartz.net 自己写线程去控制是一件蛋很疼的事。
ShinNakoruru 2013-08-22
  • 打赏
  • 举报
回复
如果一个线程没有执行完毕,也不推荐你强制关闭它。你可以设置一个公共的bool字段,所有线程读取该字段,一旦发现为false,就停止处理直接结束,这样就达到了关闭线程的效果。
yqlvcxl_2007 2013-08-22
  • 打赏
  • 举报
回复
那我怎么将所有开启的线程关闭呢 private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { //thread.Abort(); //Clientthread.Abort(); foreach (Form frm in this.MdiChildren) { frm.Close(); } this.Close(); System.Environment.Exit(0); } 我这样写,总是报错,该怎么写合适
ShinNakoruru 2013-08-22
  • 打赏
  • 举报
回复
其实问题应该从“刷新时间比处理时间短”入手,造一个设备要1小时*人,但是客户每30分钟就要1个设备,而人力是有限的,这本来就是会耗尽资源的事情。应该考虑从业务上去更改,或者提升处理程序的效率
yqlvcxl_2007 2013-08-22
  • 打赏
  • 举报
回复
大牛们该出来

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧