社区
C#
帖子详情
多线程 界面卡死
Cazrael
2011-07-20 05:47:46
现在在写一个类似一键安装的东西
其中一个Copy()方法由于计算量大会导致界面卡死
于是将Copy()方法放到子线程里进行
newThread.Start();
newThread.Join();
......//需要继续执行的代码
但这样仍然会导致主界面开始
现在要求主线程等待子线程结束后继续执行后面的代码
但是主界面(一个Form)不会卡死!
求一方法!
...全文
1016
21
打赏
收藏
多线程 界面卡死
现在在写一个类似一键安装的东西 其中一个Copy()方法由于计算量大会导致界面卡死 于是将Copy()方法放到子线程里进行 newThread.Start(); newThread.Join(); ......//需要继续执行的代码 但这样仍然会导致主界面开始 现在要求主线程等待子线程结束后继续执行后面的代码 但是主界面(一个Form)不会卡死! 求一方法!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
就是这位朋友的这个意思
但是不知道怎么实现咯 加个等待画面 怎么得到子线程完成的消息 然后继续执行主线程剩下的任务呢 能给出例子或具体代码么 我比较菜 谢谢
以专业开发人员为伍
2011-07-22
打赏
举报
回复
[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)
WinForm
多线程
+委托防止
界面
卡死
在处理大量数据计算或显示时,WinForm应用可能会出现
界面
卡死
的问题。通过引入
多线程
和委托,可以有效解决这个问题,确保用户
界面
的流畅响应。
Java
多线程
界面
卡死
_WinForm
多线程
+委托防止
界面
卡死
该博客探讨了在Java应用中,如何使用
多线程
和委托来避免
界面
卡死
问题。通过创建后台线程进行大量计算或操作,并利用委托更新
界面
元素,确保UI的流畅响应。示例代码展示了在WinForm应用程序中如何实现这一方法。
QT
多线程
—主
界面
卡死
解决方案
本文探讨了如何使用
多线程
技术优化耗时操作,避免
界面
卡死
,同时介绍了如何在主
界面
更新时确保用户体验。通过实例演示了如何在单独线程中执行耗时任务,并通过进度对话框和定时器提示用户任务状态。
Winform
多线程
--解决
界面
卡死
问题
本文介绍了如何使用Winform
多线程
技术来避免
界面
卡死
问题,通过参考文章《Winform
多线程
--解决
界面
卡死
问题》和另一篇相关博客,总结了关键的解决方案和实践经验。
c#
多线程
防止
界面
卡死
本文介绍了一种使用
多线程
技术防止Windows应用程序
界面
在长时间运算时出现
卡死
现象的方法。通过创建一个子线程负责后台任务并在主线程中更新
界面
,确保了良好的用户体验。文章提供了具体的C#代码实例。
C#
111,132
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章