c#窗体无响应,程序卡死

qq_30853339 2017-09-26 03:33:03
用作业调度的方法来进行多个文件同时下载,文件移动,个别文件下载时会导致窗体无响应,而且程序也没反应了。求大神来指导一下
...全文
1407 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰冷的小爪 2017-09-30
  • 打赏
  • 举报
回复
引用 20 楼 jshzp 的回复:
[quote=引用 14 楼 sp1234 的回复:] 编程设计中千万不要胡乱写 Sleep 语句。既然你很重视效率,又怎么会去阻塞 Sleep 呢?写 Sleep 其实本身就是无助的表现,不得已的表现,而如果你认为这就是业务需求(业务就是需要故意拖延一段时间),那为什么不使用定时器设计模式呢? 多从事件、异步角度学习程序设计。要设计好程序,你先删除 Sleep 语句,然后就能看到真实的编程技术。
老大讲得总是挺有道理的,虽然言语刻薄了点*^_^*[/quote] 顶!d=====( ̄▽ ̄*)b
阿良chjlcn 2017-09-30
  • 打赏
  • 举报
回复
长时间处理的,要用到多线程处理
jshzp 2017-09-29
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
编程设计中千万不要胡乱写 Sleep 语句。既然你很重视效率,又怎么会去阻塞 Sleep 呢?写 Sleep 其实本身就是无助的表现,不得已的表现,而如果你认为这就是业务需求(业务就是需要故意拖延一段时间),那为什么不使用定时器设计模式呢? 多从事件、异步角度学习程序设计。要设计好程序,你先删除 Sleep 语句,然后就能看到真实的编程技术。
老大讲得总是挺有道理的,虽然言语刻薄了点*^_^*
qq_30853339 2017-09-28
  • 打赏
  • 举报
回复
引用 12 楼 caozhy 的回复:
放在工作线程 http://blog.csdn.net/zaocha321/article/details/52537903 http://download.csdn.net/download/gyb8400/7759463
就是放在工作线程中的
zkj66278006 2017-09-28
  • 打赏
  • 举报
回复
使用多线程技术 或者 异步委托来解决窗体卡死的问题 网上代码一大堆 不过要根据你自己的情况来利用
qq_30853339 2017-09-28
  • 打赏
  • 举报
回复
引用 11 楼 duanzi_peng 的回复:
[quote=引用 10 楼 qq_30853339 的回复:] [quote=引用 8 楼 duanzi_peng 的回复:] [quote=引用 7 楼 qq_30853339 的回复:] [quote=引用 4 楼 duanzi_peng 的回复:] 导致窗体无响应,而且程序也没反应了 ->操作导致主线程阻塞,多个文件同时下载要异步分开,做到互不影响。 PS:个人观点,欢迎指正。
我是有这样做的,也是没问题的,现在的问题是有个别文件不知道是不是太小,下载过快,导致频繁操作控件导致的? if (ProgressBar != null) { instance.flowLayoutPanel.Controls.Remove(ProgressBar); //ProgressBar.Dispose(); } if (label != null) { instance.flowLayoutPanel.Controls.Remove(label); //label.Dispose(); } 下载完之后,进行的操作。 [/quote] 不会是因为操作控件导致的,只是单单的移除。 贴上部分下载的代码[/quote] List<string> thumbList = new List<string>(); double length = list.Count; int index = 1; for (int i = 0; i < orderDetailCount; i++) { //手工台历需要保持一套套的属性,然后自动化那边去复制 //if (i > 0 && (w.ProductType == 1024 || w.ProductType == 10251)) //{ // break; //} foreach (var photoPrintItem in list) { //转换设计数据 var p = JsonConvert.DeserializeObject<MPage>(photoPrintItem.DesignData); if (p != null) { foreach (var photo in p.imagebox_list) { Stream stream = null; if (photo != null) { stream = RenderClass.GetPrintSource(new Guid(photo.image.id), photoPrintItem.UserId, id, (int)photoPrintItem.ProductId); if (stream != null) { RenderClass.SavePhoto(path + photo.image.id + ".jpg", stream); //b.Save(path + photo.image.id+".jpg"); set(MaxValue, value++, 0); Thread.Sleep(1000); } else { throw new Exception("Can not find file:[photoId]:" + photo.image.id); } } } } } } [/quote] 单单的一个sleep 就认为是异步了?sleep 会挂起当前线程,导致代码不继续执行。不应该sleep,而是用多线程去处理下载。 PS:个人观点,欢迎指正。[/quote] //1.首先创建一个作业调度池 ISchedulerFactory schedf = new StdSchedulerFactory(properties); sched = schedf.GetScheduler(); //2.创建出来一个具体的作业 IJobDetail job = JobBuilder.Create<JobDemo>().Build(); //3.创建并配置一个触发器 ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(int.MaxValue)).Build(); //4.加入作业调度池中 sched.ScheduleJob(job, trigger); //5.开始运行 sched.Start(); 我是在作业调度执行的那一线程中执行下载的。 // 设置线程池 properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; properties["quartz.threadPool.threadCount"] = "2"; properties["quartz.threadPool.threadPriority"] = "Normal";
qq_30853339 2017-09-28
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
编程设计中千万不要胡乱写 Sleep 语句。既然你很重视效率,又怎么会去阻塞 Sleep 呢?写 Sleep 其实本身就是无助的表现,不得已的表现,而如果你认为这就是业务需求(业务就是需要故意拖延一段时间),那为什么不使用定时器设计模式呢? 多从事件、异步角度学习程序设计。要设计好程序,你先删除 Sleep 语句,然后就能看到真实的编程技术。
//1.首先创建一个作业调度池 ISchedulerFactory schedf = new StdSchedulerFactory(properties); sched = schedf.GetScheduler(); //2.创建出来一个具体的作业 IJobDetail job = JobBuilder.Create<JobDemo>().Build(); //3.创建并配置一个触发器 ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(5).WithRepeatCount(int.MaxValue)).Build(); //4.加入作业调度池中 sched.ScheduleJob(job, trigger); //5.开始运行 sched.Start(); 我是用作业调度来实现的,那个Sleep 语句是以为是操作控件频繁才加上去,单纯的拖一下时间的。
  • 打赏
  • 举报
回复
编程设计中千万不要胡乱写 Sleep 语句。既然你很重视效率,又怎么会去阻塞 Sleep 呢?写 Sleep 其实本身就是无助的表现,不得已的表现,而如果你认为这就是业务需求(业务就是需要故意拖延一段时间),那为什么不使用定时器设计模式呢? 多从事件、异步角度学习程序设计。要设计好程序,你先删除 Sleep 语句,然后就能看到真实的编程技术。
  • 打赏
  • 举报
回复
引用 5 楼 qq_30853339 的回复:
我是有这样做的,也是没问题的,现在的问题是有个别文件不知道是不是太小,下载过快,导致频繁操作控件导致的? if (ProgressBar != null) { instance.flowLayoutPanel.Controls.Remove(ProgressBar); //ProgressBar.Dispose(); } if (label != null) { instance.flowLayoutPanel.Controls.Remove(label); //label.Dispose(); } 下载完之后,进行的操作。
那就延迟500毫秒再处理。在定时器的回调中再来 Controls.Add(....),此时如果已经具备 Remove 的条件了了,那么根本就不应该 Add。
nanfei01055 2017-09-28
  • 打赏
  • 举报
回复
使用异步或者多线程,UI线程和IO线程分离。这样绝不会卡死。
threenewbee 2017-09-27
  • 打赏
  • 举报
回复
放在工作线程 http://blog.csdn.net/zaocha321/article/details/52537903 http://download.csdn.net/download/gyb8400/7759463
qq_30853339 2017-09-27
  • 打赏
  • 举报
回复
引用 8 楼 duanzi_peng 的回复:
[quote=引用 7 楼 qq_30853339 的回复:] [quote=引用 4 楼 duanzi_peng 的回复:] 导致窗体无响应,而且程序也没反应了 ->操作导致主线程阻塞,多个文件同时下载要异步分开,做到互不影响。 PS:个人观点,欢迎指正。
我是有这样做的,也是没问题的,现在的问题是有个别文件不知道是不是太小,下载过快,导致频繁操作控件导致的? if (ProgressBar != null) { instance.flowLayoutPanel.Controls.Remove(ProgressBar); //ProgressBar.Dispose(); } if (label != null) { instance.flowLayoutPanel.Controls.Remove(label); //label.Dispose(); } 下载完之后,进行的操作。 [/quote] 不会是因为操作控件导致的,只是单单的移除。 贴上部分下载的代码[/quote] List<string> thumbList = new List<string>(); double length = list.Count; int index = 1; for (int i = 0; i < orderDetailCount; i++) { //手工台历需要保持一套套的属性,然后自动化那边去复制 //if (i > 0 && (w.ProductType == 1024 || w.ProductType == 10251)) //{ // break; //} foreach (var photoPrintItem in list) { //转换设计数据 var p = JsonConvert.DeserializeObject<MPage>(photoPrintItem.DesignData); if (p != null) { foreach (var photo in p.imagebox_list) { Stream stream = null; if (photo != null) { stream = RenderClass.GetPrintSource(new Guid(photo.image.id), photoPrintItem.UserId, id, (int)photoPrintItem.ProductId); if (stream != null) { RenderClass.SavePhoto(path + photo.image.id + ".jpg", stream); //b.Save(path + photo.image.id+".jpg"); set(MaxValue, value++, 0); Thread.Sleep(1000); } else { throw new Exception("Can not find file:[photoId]:" + photo.image.id); } } } } } }
  • 打赏
  • 举报
回复
引用 10 楼 qq_30853339 的回复:
[quote=引用 8 楼 duanzi_peng 的回复:] [quote=引用 7 楼 qq_30853339 的回复:] [quote=引用 4 楼 duanzi_peng 的回复:] 导致窗体无响应,而且程序也没反应了 ->操作导致主线程阻塞,多个文件同时下载要异步分开,做到互不影响。 PS:个人观点,欢迎指正。
我是有这样做的,也是没问题的,现在的问题是有个别文件不知道是不是太小,下载过快,导致频繁操作控件导致的? if (ProgressBar != null) { instance.flowLayoutPanel.Controls.Remove(ProgressBar); //ProgressBar.Dispose(); } if (label != null) { instance.flowLayoutPanel.Controls.Remove(label); //label.Dispose(); } 下载完之后,进行的操作。 [/quote] 不会是因为操作控件导致的,只是单单的移除。 贴上部分下载的代码[/quote] List<string> thumbList = new List<string>(); double length = list.Count; int index = 1; for (int i = 0; i < orderDetailCount; i++) { //手工台历需要保持一套套的属性,然后自动化那边去复制 //if (i > 0 && (w.ProductType == 1024 || w.ProductType == 10251)) //{ // break; //} foreach (var photoPrintItem in list) { //转换设计数据 var p = JsonConvert.DeserializeObject<MPage>(photoPrintItem.DesignData); if (p != null) { foreach (var photo in p.imagebox_list) { Stream stream = null; if (photo != null) { stream = RenderClass.GetPrintSource(new Guid(photo.image.id), photoPrintItem.UserId, id, (int)photoPrintItem.ProductId); if (stream != null) { RenderClass.SavePhoto(path + photo.image.id + ".jpg", stream); //b.Save(path + photo.image.id+".jpg"); set(MaxValue, value++, 0); Thread.Sleep(1000); } else { throw new Exception("Can not find file:[photoId]:" + photo.image.id); } } } } } } [/quote] 单单的一个sleep 就认为是异步了?sleep 会挂起当前线程,导致代码不继续执行。不应该sleep,而是用多线程去处理下载。 PS:个人观点,欢迎指正。
teenagermostr 2017-09-26
  • 打赏
  • 举报
回复
多线程直接解决
  • 打赏
  • 举报
回复
引用 7 楼 qq_30853339 的回复:
[quote=引用 4 楼 duanzi_peng 的回复:] 导致窗体无响应,而且程序也没反应了 ->操作导致主线程阻塞,多个文件同时下载要异步分开,做到互不影响。 PS:个人观点,欢迎指正。
我是有这样做的,也是没问题的,现在的问题是有个别文件不知道是不是太小,下载过快,导致频繁操作控件导致的? if (ProgressBar != null) { instance.flowLayoutPanel.Controls.Remove(ProgressBar); //ProgressBar.Dispose(); } if (label != null) { instance.flowLayoutPanel.Controls.Remove(label); //label.Dispose(); } 下载完之后,进行的操作。 [/quote] 不会是因为操作控件导致的,只是单单的移除。 贴上部分下载的代码
qq_30853339 2017-09-26
  • 打赏
  • 举报
回复
引用 4 楼 duanzi_peng 的回复:
导致窗体无响应,而且程序也没反应了 ->操作导致主线程阻塞,多个文件同时下载要异步分开,做到互不影响。 PS:个人观点,欢迎指正。
我是有这样做的,也是没问题的,现在的问题是有个别文件不知道是不是太小,下载过快,导致频繁操作控件导致的? if (ProgressBar != null) { instance.flowLayoutPanel.Controls.Remove(ProgressBar); //ProgressBar.Dispose(); } if (label != null) { instance.flowLayoutPanel.Controls.Remove(label); //label.Dispose(); } 下载完之后,进行的操作。
qq_30853339 2017-09-26
  • 打赏
  • 举报
回复
[quote=引用 5 楼 qq_30853339 的回复:] 我是有这样做的,也是没问题的,现在的问题是有个别文件不知道是不是太小,下载过快,导致频繁操作控件导致的? if (ProgressBar != null) { instance.flowLayoutPanel.Controls.Remove(ProgressBar); //ProgressBar.Dispose(); } if (label != null) { instance.flowLayoutPanel.Controls.Remove(label); //label.Dispose(); } 下载完之后,进行的操作。
  • 打赏
  • 举报
回复
导致窗体无响应,而且程序也没反应了 ->操作导致主线程阻塞,多个文件同时下载要异步分开,做到互不影响。 PS:个人观点,欢迎指正。
qq_30853339 2017-09-26
  • 打赏
  • 举报
回复
自己顶
qq_30853339 2017-09-26
  • 打赏
  • 举报
回复
自己顶
加载更多回复(2)

111,097

社区成员

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

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

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