110,566
社区成员
发帖
与我相关
我的任务
分享
//当前类为一个winform类,假设是类A
Thread trd_Topic;//为全局变量
private delegate void FlushClient();//代理 为全局变量
FormDoc doc = null;//全局变量,为要刷新数据的UI
Begin()
{
....
trd_Topic = new Thread(CrossThreadFlush);
trd_Topic.IsBackground = true;
trd_Topic.Start();
....
}
private void CrossThreadFlush()
{
while (true)
{
if (trd_Topic.ThreadState == ThreadState.Stopped)
{ }
else
{
Thread.Sleep(2000);
net_Task();
}
}
}
private void net_Task()
{
monitorErrorCount = 0;
try
{
if (this.InvokeRequired)//等待异步
{
FlushClient fc = new FlushClient(net_Task);
this.BeginInvoke(fc);//通过代理调用刷新方法
}
else
{
....................
lock (OpenStations)
{
for (int i = 0; i < OpenStations.Count; i++)
{
try
{
foreach (Equ equ in Equs.Equipments)
{
if (equ.Species.Flag)
{
doc = this.DockPanel.FindDocument(name) as StationLayoutDoc;//doc为要刷新的UI,可以假设为类B
if (doc != null)
{
doc.Invoke(new EventHandler(getTopic), new object[] { equ, EventArgs.Empty });//getTopic 函数实现数据的读取已经doc界面的刷新
}
}
}
}
catch (Exception)
{
}
}
}
..............................
}
}
catch(Exception e)
{}
}
private void getTopic(object o, EventArgs e)
{
//......................获取数据的操作
doc.refresh(content, equ);//content获取到的刷新数据,equ为要刷新的设备
//.......................其他操作
}
winform绑定数据,也可以试试分页显示查询,这样数据量就会小很多,一般不会出现卡死这种情况
代码就不细看了 Background线程只在系统比较闲的时候才被调用 可以在工作线程的适当位置Sleep(10)
我刷新的是flash的图标,不是datagridview [quote=引用 2 楼 xunzaosiyecao 的回复:] winform绑定数据,也可以试试分页显示查询,这样数据量就会小很多,一般不会出现卡死这种情况