社区
C#
帖子详情
多线程 界面卡死
Cazrael
2011-07-20 05:47:46
现在在写一个类似一键安装的东西
其中一个Copy()方法由于计算量大会导致界面卡死
于是将Copy()方法放到子线程里进行
newThread.Start();
newThread.Join();
......//需要继续执行的代码
但这样仍然会导致主界面开始
现在要求主线程等待子线程结束后继续执行后面的代码
但是主界面(一个Form)不会卡死!
求一方法!
...全文
965
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)
C#
多线程
解决
界面
卡死
问题的完美解决方案_极简版
C#
多线程
解决
界面
卡死
问题的完美解决方案,简化了之前的写法,更容易记住和理解 C#
多线程
解决
界面
卡死
问题的完美解决方案,简化了之前的写法,更容易记住和理解
C#
多线程
解决
界面
卡死
问题的完美解决方案
C#
多线程
解决
界面
卡死
问题的完美解决方案
JAVA
多线程
精讲下
本课程是《零基础学Java》系列课程中的"
多线程
"相关课程.授课形式延续了之前课程的授课风格。内容细腻、详尽,由浅入深!通过本门课程的学习你可以深刻理解Java
多线程
的原理及实现运行机制,深刻学习
多线程
的生命...
qt
多线程
防止主线程做循环操作导致
界面
假死
qt
多线程
防止主线程做循环操作导致
界面
假死。试过
多线程
的几种方法,只有这个方法可行。代码亲测可行。在子线程死循环,
界面
正常不死!!!
QT
多线程
—主
界面
卡死
解决方案
由于耗时的操作会独占系统cpu资源 ,让
界面
卡死
在那里,这时需要考虑
多线程
方案,将耗时的操作放在主线程之外的线程中执行。该demo通过
多线程
为主
界面
卡死
提供一种解决方案。
C#
110,538
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章