多线程 界面卡死

Cazrael 2011-07-20 05:47:46
现在在写一个类似一键安装的东西

其中一个Copy()方法由于计算量大会导致界面卡死

于是将Copy()方法放到子线程里进行

newThread.Start();
newThread.Join();
......//需要继续执行的代码

但这样仍然会导致主界面开始

现在要求主线程等待子线程结束后继续执行后面的代码
但是主界面(一个Form)不会卡死!
求一方法!
...全文
965 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cazrael 2011-08-18
  • 打赏
  • 举报
回复
结贴 直接用invoke()函数就行
zengguoyu 2011-08-01
  • 打赏
  • 举报
回复
如果是在用不好线程,就使用控件Backgroundworker,它有三个事件,其中有一个DoWork 是处理数据的事件,也就你把你的Copy、操作发在这个事件中执行就行了,这样界面就不会卡死


您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。

这样完全不用你自己去处理线程,希望对你有帮助
wind4fly 2011-07-22
  • 打赏
  • 举报
回复
Join()等待线程结束。
Join(1000)等待1000毫秒后继续。
aXen 2011-07-22
  • 打赏
  • 举报
回复
长时间操作不要放在主线程中。不然窗口没有机会处理消息。
lazyleland 2011-07-22
  • 打赏
  • 举报
回复
如果FrmMainCopyFinish有更新UI的操作,则要再使用代理,调用this.Invoke方法转到主线程。
lazyleland 2011-07-22
  • 打赏
  • 举报
回复
private event EventHandler CopyFinish;
private void Copy()
{
this.CopyFinish += new EventHandler(FrmMainCopyFinish);
System.Threading.Thread t = new Thread(new ThreadStart(CopyInNewThread));
}

private void CopyInNewThread()
{
// Copy...

//
if (this.CopyFinish != null)
CopyFinish(null, null);
}

void FrmMainCopyFinish(object sender, EventArgs e)
{
// palapala...
}
soaringbird 2011-07-22
  • 打赏
  • 举报
回复
事件、委托、回调
xianzhong2008 2011-07-22
  • 打赏
  • 举报
回复
把JOIN()去掉不就ok了
Cazrael 2011-07-22
  • 打赏
  • 举报
回复
我现在明白JOIN就是阻塞线程的意思了。。求解决方案 最好给出代码 谢谢
Cazrael 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 niss 的回复:]
楼主的意思是一口气执行完这个任务,其中有个子任务很耗时间是不是,不想卡住主界面,但如果放到线程里又要求主界面必须等待整个任务的完成才允许用户操作是不是?这个样子给主界面加个等待画面行不?
[/Quote]


就是这位朋友的这个意思

但是不知道怎么实现咯 加个等待画面 怎么得到子线程完成的消息 然后继续执行主线程剩下的任务呢 能给出例子或具体代码么 我比较菜 谢谢
  • 打赏
  • 举报
回复
[Quote=引用楼主 cazrael 的回复:]
现在在写一个类似一键安装的东西

其中一个Copy()方法由于计算量大会导致界面卡死

于是将Copy()方法放到子线程里进行

newThread.Start();
newThread.Join();
......//需要继续执行的代码

但这样仍然会导致主界面开始

现在要求主线程等待子线程结束后继续执行后面的代码
但是主界面(一个Form)不会卡死!
……
[/Quote]

看不懂你的意思。

“后面的代码”都卡死了,主界面还不卡死吗?

你可以把“后面的代码”也一并移到线程中的方法,它去调用。
niss 2011-07-21
  • 打赏
  • 举报
回复
楼主的意思是一口气执行完这个任务,其中有个子任务很耗时间是不是,不想卡住主界面,但如果放到线程里又要求主界面必须等待整个任务的完成才允许用户操作是不是?这个样子给主界面加个等待画面行不?
636f6c696e 2011-07-21
  • 打赏
  • 举报
回复
你界面卡死的原因是操作UI的线程也就是主线程必须等子线程操作完再继续操作,由于copy的时间很长,相当于有一部分时间UI无法响应,所以卡死.
你可以创建一个线程去等newThread,然后执行继续的代码.
或者newThread结束后往主线程发送一个消息,主线程收到后继续执行代码.
ghost5216 2011-07-21
  • 打赏
  • 举报
回复
现在要求主线程等待子线程结束后继续执行后面的代码
但是主界面(一个Form)不会卡死!

这个要求很矛盾

可以把线程启动代码放在末尾,后面没有代码,才不会卡
sdl2005lyx 2011-07-21
  • 打赏
  • 举报
回复
用Form.Invoke( Delegate method) :在拥有此控件的基础窗口句柄的线程上执行指定的委托。


bustersword 2011-07-21
  • 打赏
  • 举报
回复
Join();......Blocks the calling thread until a thread terminates.
Cazrael 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yuwenge 的回复:]
Copy里面不要有操作ui的动作。
[/Quote]

没有 只有一个很干净的复制文件的函数
mjay0210 2011-07-21
  • 打赏
  • 举报
回复
哥们 你都join了 还能咋说呢 ....

好好了解下join
Cazrael 2011-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 colinfang2006 的回复:]
你可以创建一个线程去等newThread,然后执行继续的代码.
或者newThread结束后往主线程发送一个消息,主线程收到后继续执行代码.
[/Quote]

能讲讲后者的具体实现么
就是想通过后者来实现 可是不会。。
卧_槽 2011-07-20
  • 打赏
  • 举报
回复
Copy里面不要有操作ui的动作。
加载更多回复(1)

110,538

社区成员

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

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

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