winform界面卡死问题

睡神在睡觉 2012-07-25 10:33:59
具体问题是这样:
Show一个窗体上有一个TreeView,TreeView的Nodes数据加载时间比较长,所以我想把加载TreeNode的方法单独起一个线程来做,做好了再加载到窗体上,但是现在不管是new Thread还是BackgroundWorker都还是一样会搞的界面卡死.
代码:
//主窗体:
public void ShowNewWindow()
{
TreeForm tf = new TreeForm();
tf.Show();
tf.LoadTree();
}
//子窗体具有一个panle一个treeview,treeview加载的时候显示panle上面有gif动画表示加载中:
public void LoadTree()
{
treeView1.Nodes.Clean();
treeView1.Nodes.Add(GetNode());
}

private TreeNode GetNode()
{
//....获得到节点对象的方法,最终return一个TreeNode对象
}


我做的时候单独把GetNode放在一个线程里去做或者是后台去做,感觉还是会阻塞主线程,毕竟操作了主窗体上的控件,还是占用了资源,没想明白怎么搞才行。

请教下,我应该如何加线程才可以不让主界面避免卡死的状态呢?我的panle应该如何控制才能正常显示出来呢?
...全文
997 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaosa_1314 2012-10-25
  • 打赏
  • 举报
回复
有木有具体的代码之类的,我用了线程了可是还是卡死没有改变
lshfong 2012-10-25
  • 打赏
  • 举报
回复
用线程托管方式来操作界面
xiaosa_1314 2012-10-25
  • 打赏
  • 举报
回复
LZ 能不能教教我 我正在面临这个问题。没有看懂你的代码。而且我对线程不是太熟悉。 麻烦类。
  • 打赏
  • 举报
回复
还没结贴啊,我的无级树很快很好,只用了异步委托。
睡神在睡觉 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 的回复:]
处理像这样问题一般大量使用异步委托就可以了,就像你写的那样
BeginInvoke(new System.Threading.ThreadStart(() =>
{
代码。。。。。。
}));
[/Quote]

谢谢指点,感觉外面的Tread也有点多余了呢。。。
  • 打赏
  • 举报
回复
处理像这样问题一般大量使用异步委托就可以了,就像你写的那样
BeginInvoke(new System.Threading.ThreadStart(() =>
{
代码。。。。。。
}));
zhaigates 2012-08-12
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

谢谢各位了,突然想明白了,一时没转过弯,散分

new System.Threading.Thread(new System.Threading.ThreadStart(() =>
{
TreeNode tNData = RSISTree.TreeLoad();
……
[/Quote]
好乱。。。
睡神在睡觉 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
加载node 用BackgroundWorker你是怎么加载的?求代码
[/Quote]

LoadTree()执行操作在DoWork里面
c2606050113 2012-07-25
  • 打赏
  • 举报
回复
加载node 用BackgroundWorker你是怎么加载的?求代码
睡神在睡觉 2012-07-25
  • 打赏
  • 举报
回复
现在的问题感觉不是在GetNode的线程处理上面,这里新建线程处理肯定是没问题,关键的问题是调用的是在主线程里面,如何能让主线程不挂起等待响应?这个才是关键需要大家帮忙解决的。。。

期待高手解答
睡神在睡觉 2012-07-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
public void LoadTree()
{
treeView1.Nodes.Clean();
Thread thread=new Thread(new ThreadStart(Test));
thread.IsBackground=true;
thread.Start();
}

private void Test()
{
treeView1.Node……
[/Quote]


这样也没效果
private TreeNode GetNode()
{
new System.Threading.Thread(new System.Threading.ThreadStart(() =>
{
//....获得到节点对象的方法,最终return一个TreeNode对象
})){ IsBackground=true}.Start();
}
事理 2012-07-25
  • 打赏
  • 举报
回复

public void LoadTree()
{
treeView1.Nodes.Clean();
Thread thread=new Thread(new ThreadStart(Test));
thread.IsBackground=true;
thread.Start();
}

private void Test()
{
treeView1.Nodes.Add(GetNode());
}
睡神在睡觉 2012-07-25
  • 打赏
  • 举报
回复
貌似是不行,只要是涉及到了主线程上treeview控件的操作,都会让主线程挂起,不执行完线程不会继续下去。。。莫不是只能操作属性了?
adrianEvin 2012-07-25
  • 打赏
  • 举报
回复
先调用线程,然后跟控件交互的时候用委托去执行。
MethodInvoker m = new MethodInvoker(() =>
{
//加载的代码
});
Invoke(m);
看行不行
睡神在睡觉 2012-07-25
  • 打赏
  • 举报
回复
莫非只能是GetNode用一个线程处理了,处理完通过消息来通知窗体刷新么?不会吧,这样是不是太繁琐了
睡神在睡觉 2012-07-25
  • 打赏
  • 举报
回复
public void LoadTree()
{
panle1.Visible = true;
Application.DoEvents();
treeView1.Nodes.Clean();
treeView1.Nodes.Add(GetNode());
panle1.Visible = false;
}

private TreeNode GetNode()
{
new System.Threading.Thread(new System.Threading.ThreadStart(() =>
{
//....获得到节点对象的方法,最终return一个TreeNode对象
})).Start();
}


这样子吗?貌似是这表不治本,DoEvents是能让panle刷新出来,但是treeview操作没有完成子窗体的主线程还是会等待响应,界面看似刷新了,但是还是处于假死状态
dog357 2012-07-25
  • 打赏
  • 举报
回复
new Thread的话怎么会卡死主线程呢,贴出代码看看线程是咋写的
shushukui 2012-07-25
  • 打赏
  • 举报
回复
多线程即可,或者加载过程中用DoEvents交让控制权。
睡神在睡觉 2012-07-25
  • 打赏
  • 举报
回复
代码中没有写线程,这样做的时候该如何去加,主要的操作是这些,不明白如何去加才不会阻塞主线程,所以多余的线程操作没有写上来,希望各位能帮我加上去线程操作,才没有写
iyomumx 2012-07-25
  • 打赏
  • 举报
回复
你给的代码里完全看不出多线程的痕迹
加载更多回复(23)

110,538

社区成员

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

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

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