社区
C#
帖子详情
多线程 界面卡死
Cazrael
2011-07-20 05:47:46
现在在写一个类似一键安装的东西
其中一个Copy()方法由于计算量大会导致界面卡死
于是将Copy()方法放到子线程里进行
newThread.Start();
newThread.Join();
......//需要继续执行的代码
但这样仍然会导致主界面开始
现在要求主线程等待子线程结束后继续执行后面的代码
但是主界面(一个Form)不会卡死!
求一方法!
...全文
973
21
打赏
收藏
多线程 界面卡死
现在在写一个类似一键安装的东西 其中一个Copy()方法由于计算量大会导致界面卡死 于是将Copy()方法放到子线程里进行 newThread.Start(); newThread.Join(); ......//需要继续执行的代码 但这样仍然会导致主界面开始 现在要求主线程等待子线程结束后继续执行后面的代码 但是主界面(一个Form)不会卡死! 求一方法!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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#中
多线程
解决
界面
卡死
问题的方法主要包括使用BackgroundWorker和async/await模式。这两种方法都旨在将耗时操作与UI更新分离,确保用户
界面
始终响应。理解并熟练运用这些技术,能够显著提升C#应用的用户...
QT
多线程
—主
界面
卡死
解决方案
为了解决这个问题,程序员通常会采用
多线程
技术。QT框架提供了强大的
多线程
支持,让我们可以方便地将耗时任务转移到后台线程,以保持主线程的响应性,从而提高用户体验。 QT中的
多线程
主要涉及到QThread类和Qt的...
WPFC#.net 跨线程更新UI 线程测试 解决
界面
卡死
Thread 达到跨线程更新UI 虽然使用Dispatcher.Invoke 和模拟winform 里面的DoEvent 但是运行中关闭还是会有异常,而且耗资源高; 第二种 : DispatcherTimer 失败:UI还是会卡顿; 第三种 : Timer 建议使用、资源...
[精仿]QQ2013局域网通讯(10.30更新版-带最新版
界面
库)
25.
多线程
大文件传输功能,支持无上限大文件传输,有进度条显示进程度。 26.
界面
库已封装了大图取主色调,颜色判断暗亮等多项功能。 27.如果你觉得获取天气让你的登录太慢不想要的话,注释相关调用方法即可快速登录...
一个 C# 做的日记本
通过分析该项目的源代码,开发者可以深入理解C#编程语言的高级特性,如类和对象的使用,
多线程
处理,以及如何设计出用户友好的
界面
。此外,这个项目本身也可以作为一个个人项目或教学示例,帮助开发者提升编程和项目...
C#
111,111
社区成员
642,556
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章