winform多线程假死(不能拖动窗口,窗口未响应)问题,在线等

qq_30853339 2017-09-13 02:56:51
开两个线程,同时下载,一个线程下载完后加另一个线程时窗体出现无法拖动,未响应。怎么解决啊?各位大神。
...全文
819 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Benjay77 2017-09-16
  • 打赏
  • 举报
回复
跨线程嘛 Thread Pool 或者 Task 都行
ilikeff8 2017-09-14
  • 打赏
  • 举报
回复
你如果是写了类似这种代码。线程等于没用

            ThreadPool.QueueUserWorkItem(obj =>
            {
                this.Invoke((Action)(() => {
                    for (。。)
                    {
                        。。
                    }
                }));
            });
Coder_delphi 2017-09-14
  • 打赏
  • 举报
回复
如果有ui相关操作要使用托管。
  • 打赏
  • 举报
回复
如果有一些阻塞操作,你写代码时通常就会知道。关键是有些不经意产生的问题,例如递归地产生了过多的“垃圾”任务,这凭想象是很难看出到底有多少冗余的任务的,需要看日志。 而 Debug 类下面有一些静态方法,用于调试(在 Release 版本就会自动去掉这些代码)时打印日志。这是开发时常用的方法,例如 Debug.Assert、Debug.Print/Trace 方法等等,会在源代码中插入一些断言和日志,这个技术可能比编写普通的代码还重要。就好像是特别会诊断还能给病人省钱的大夫,肯定比那些只会背医学书本知识的大夫更受欢迎。
bloodish 2017-09-13
  • 打赏
  • 举报
回复
主线程阻塞, 原因可能是大量的IO操作,大量的UI操作,在主线程中直接Sleep,等等. VS在Debug状态下,先直接break,再查看Debug->Windows->Parallel Stacks,应该能定位是在何处阻塞.
jhone99 2017-09-13
  • 打赏
  • 举报
回复
是否在线程里操作UI了? 需要这样 private delegate void ShowDateThreadWork(); private void ShowDateFunction() { if (this.Text1.InvokeRequired) { ShowDateThreadWork showDatehreadWork = new ShowDateThreadWork(ShowDateFunction); this.Invoke(showDatehreadWork); } else { Text1.text = "Hello"; } }
sj490790083 2017-09-13
  • 打赏
  • 举报
回复
为什么不在一个线程里分批下载,每次3个
易2017 2017-09-13
  • 打赏
  • 举报
回复
引用 7 楼 qq_30853339 的回复:
有多个文件下载,但是要求一次只能下载三个。
看看你线程切换的逻辑是否正确,有代码最好贴代码
qq_30853339 2017-09-13
  • 打赏
  • 举报
回复
有多个文件下载,但是要求一次只能下载三个。
易2017 2017-09-13
  • 打赏
  • 举报
回复
引用 楼主 qq_30853339 的回复:
开两个线程,同时下载,一个线程下载完后加另一个线程时窗体出现无法拖动,未响应。怎么解决啊?各位大神。
加另一个线程是什么意思?既然是同时下载为什么还要加载另一个线程。一般窗体卡死不外乎你错误的、频繁的跨线程操作UI界面。注意Beginvoke和invoke的使用
易2017 2017-09-13
  • 打赏
  • 举报
回复
学习
exception92 2017-09-13
  • 打赏
  • 举报
回复
窗体出现无法拖动,未响应。怎么解决啊 -》应该先清楚什么操作导致的UI界面卡死,这也是sp回复的意思。 在vs中是可以调试线程中的代码的,但一般不要那么做,因为vs的调试会挂起所有线程,这样做对执行操作时”UI为什么卡死“也没什么用。这也许就是sp让你用Debug.Print的原因。如果连Debug.Print怎么用都没有意愿去查询用法,可以忽略我的回复。 PS:个人观点,欢迎指正。
qq_30853339 2017-09-13
  • 打赏
  • 举报
回复
Debug.Print怎么用?
  • 打赏
  • 举报
回复
在涉及到 UI 过程的相关代码中,你可以写 Debug.Print "代码的位置和参数......." 这样的语句,写几个或者十几个,然后运行程序,你可以看到调试命令行窗口的日志中,哪些日志比较“疯狂”。
  • 打赏
  • 举报
回复
你可以检查、测试一下有什么疯狂地操作 UI 控件或者主线程的其它对象的代码。例如在循环中不断地干扰主线程的1、2行代码,或者是疯狂的 timer 事件触发,都是祸害。

110,534

社区成员

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

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

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