WINFORM多线程优化问题,求指教
我现在在做一个数据采集的软件,需要同时开100多个线程对100多台设备进行同时数据采集,全部通过COM口读取PLC。当只开20-30台左右设备的时候,软件正常,但超过一定数量或者时间之后,就会出现其中一些设备线程假死,线程不工作了,其它的还是正常,多线程接触的少,不知道该从哪里优化了。。。求指教。。。
代码部分:
设备是写的自定义控件,是动态创建的,一旦加载这个控件,相当于加载一台设备。
加载控件后,线程自动启动
isRun = true;
th_ex = new System.Threading.Thread(RunThread);
th_ex.IsBackground = true;
th_ex.Start();
线程内循环
private void RunThread()
{
while (isRun)
{
if (Operation.isRun)
{
run_time = DateTime.Now;
Exc_UpLoad();
}
System.Threading.Thread.Sleep(500);
}
}
部分 Exc_UpLoad代码
isEnd = false;
if (IsUse == "True")
{
int time_span = 500;
......................................................
.....................................................
....................................................
...........................
}
else
{
//
}
isEnd = true;
有用过Monitor来控制,但貌似没什么效果。
为了防止假死,我在另外在主窗体创建了一个线程进行监控这些线程
private void Auto_UploadData()
{
while (true)
{
if (Operation.isRun)
{
EX_Control();
}
//间隔
System.Threading.Thread.Sleep(2000);
}
}
而且加入了资源回收,控件清除再加载。。。
private void EX_Control()
{
foreach (Control us_c in panel1.Controls)
{
if (us_c is ucState)
{
ucState us = us_c as ucState;
if (us.IsUse == "True")
{
double ddtime = Operation.DateDiff(DateTime.Now, us.run_time);
if (ddtime > 60)//等待
{
//重置模块
try
{
ucState us_new = new ucState();
us_new = us;
us_new.Init_Data(us.dr_plc, dt_where, us.dt_plc_data);
us_new.run_time = DateTime.Now.AddSeconds(-120);
us.Dispose();
panel_Remove(us);
panel_add(us_new);
}
catch
{ }
}
}
}
System.Threading.Thread.Sleep(200);
}
GC.Collect();
}
最后还是没办法解决,刚开始还以为是交换机的问题,最后换了交换机也还是一样。。。。
请指教。。。。哪里需要改正。。。谢谢。