C#使用winform刷新界面的时候假死

gzyyan249 2014-03-17 12:35:19
各位大家好,现在我用后台线程来刷新界面,但是在数据量大的时候界面出现卡死现象,不知道如何解决,希望各位能给我一些建议,以下是程序的伪代码,希望各位能帮我看看,想想办法,谢谢!!

//当前类为一个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为要刷新的设备
//.......................其他操作
}


现在在数据量较大的时候界面会出现卡死现象,现在trd_Topic好像还是用了主线程的资源,我现在不知道用什么方法能解决这个问题,希望各位能帮我出出主意,分数没有了,希望大家见谅,谢谢!!
...全文
600 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
衣舞晨风 2014-03-17
  • 打赏
  • 举报
回复
引用 4 楼 gzyyan249 的回复:
引用 2 楼 xunzaosiyecao 的回复:
winform绑定数据,也可以试试分页显示查询,这样数据量就会小很多,一般不会出现卡死这种情况
我刷新的是flash的图标,不是datagridview
没做过,不是很清楚
gzyyan249 2014-03-17
  • 打赏
  • 举报
回复
引用 2 楼 xunzaosiyecao 的回复:
winform绑定数据,也可以试试分页显示查询,这样数据量就会小很多,一般不会出现卡死这种情况
我刷新的是flash的图标,不是datagridview
gzyyan249 2014-03-17
  • 打赏
  • 举报
回复
引用 1 楼 mikecheers 的回复:
代码就不细看了 Background线程只在系统比较闲的时候才被调用 可以在工作线程的适当位置Sleep(10)
那该怎么改成多线程呢????
衣舞晨风 2014-03-17
  • 打赏
  • 举报
回复
winform绑定数据,也可以试试分页显示查询,这样数据量就会小很多,一般不会出现卡死这种情况
庚武讲堂 2014-03-17
  • 打赏
  • 举报
回复
没仔细看你的问题,以前也有碰到过类似,windows有机制,如果比较长的任务要作,界面出现繁忙状态. 在合适的地方加上:Application.DoEvents(); 有可能解决你的问题,时间比较长,应该要有进度条,让用户体验比较好.
weizhuangwen 2014-03-17
  • 打赏
  • 举报
回复
trd_Topic线程里面执行了net_Task函数,而net_Task函数又是一个递归函数,因为在FlushClient委托中你用的是this.BeginInvoke,那么运行的代码就交给了主线程执行(UI线程),而接下来的递归函数中的代码for、foreach等循环语句都是UI线程在执行,导致你的UI界面变得很卡。 个人建议,在需要更新界面UI控件的时候才用this.BeginInvoke,来更新控件,也可以用this.BeginInvoke来执行一个委托,然后委托指向一个delegate匿名方法,实现UI线程与子线程交互
MikeCheers 2014-03-17
  • 打赏
  • 举报
回复
代码就不细看了 Background线程只在系统比较闲的时候才被调用 可以在工作线程的适当位置Sleep(10)
MikeCheers 2014-03-17
  • 打赏
  • 举报
回复
多线程么 概念比较宽泛了 简单的 你就Thread thread = new Thread(DoThreadWork); thread.Start(); void DoThreadWork() { 这里做任务 } 这个可以很复杂 但你没接触过 不好深说 最好是边做 边找些资料看看 MSDN之类的
王子文龙 2014-03-17
  • 打赏
  • 举报
回复
从你代码来看,像for循环占用的就是ui线程
gzyyan249 2014-03-17
  • 打赏
  • 举报
回复
引用 5 楼 xunzaosiyecao 的回复:
引用 4 楼 gzyyan249 的回复:
[quote=引用 2 楼 xunzaosiyecao 的回复:] winform绑定数据,也可以试试分页显示查询,这样数据量就会小很多,一般不会出现卡死这种情况
我刷新的是flash的图标,不是datagridview
没做过,不是很清楚[/quote]知道怎么写出多线程控制不??

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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