开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1822|回复: 8
收起左侧

[C#求助] C#线程结束后,界面卡死请大佬帮忙解答疑惑

[复制链接]
结帖率:63% (5/8)
发表于 2023-9-7 16:17:04 | 显示全部楼层 |阅读模式   四川省德阳市
10精币
C#线程结束后,界面卡死请大佬帮忙解答疑惑     

   Thread 任务主线程;

private void button_启动任务_Click(object sender, EventArgs e)
        {   
            任务主线程 = new Thread(执行热血任务);
            任务主线程.Start();
            button_启动任务.Enabled = false;
            button_恢复任务.Enabled = false;
            button_暂停任务.Enabled = true;
            button_停止任务.Enabled = true;

        }

        private void button_停止任务_Click(object sender, EventArgs e)
        {
            任务状态 = false;
            任务主线程.Abort();
            任务主线程.Join();
            Console.WriteLine("aaaaaaaaaaaaaaaaa");
            button_启动任务.Enabled = true;
            button_恢复任务.Enabled = false;
            button_暂停任务.Enabled = false;
            button_停止任务.Enabled=false;

        }


        private void button_暂停任务_Click(object sender, EventArgs e)
        {
            任务主线程.Suspend();
            button_启动任务.Enabled = false;
            button_恢复任务.Enabled = true;
            button_暂停任务.Enabled = false;
            button_停止任务.Enabled = true;

        }

        private void button_恢复任务_Click(object sender, EventArgs e)
        {
            任务主线程.Resume();
            button_启动任务.Enabled = false;
            button_恢复任务.Enabled = false;
            button_暂停任务.Enabled = true;
            button_停止任务.Enabled = true;
        }

        bool 任务状态 = false;
        public void 执行热血任务()//需要启动的任务
        {
            任务状态 = true;
            int 需要遍历的任务数 = checkedListBox_任务列表框.CheckedItems.Count;

            while (任务状态)//外部循环保证不停遍历任务
            {

                System.Windows.Forms.Application.DoEvents();//类似于是易语言的处理事件,防止界面卡死
                dm.辅助延时(1000);
                for (int i = 0; i < 需要遍历的任务数; i++)
                {
                    Console.WriteLine("执行任务 " + checkedListBox_任务列表框.GetItemChecked(i).ToString());

                }

            }

最佳答案

查看完整内容

在执行"热血任务"的时候是个死循环 ...
结帖率:50% (1/2)

签到天数: 1 天

发表于 2023-9-7 16:17:05 | 显示全部楼层   新疆维吾尔自治区巴音郭楞蒙古自治州
本帖最后由 君临 于 2023-9-8 23:39 编辑

在执行"热血任务"的时候是个死循环
[C#] 纯文本查看 复制代码
System.Windows.Forms.Application.DoEvents();这句代码是告诉窗体先去处理其他消息吧.我这个不着急

调用Abort其实是给这个线程扔个"ThreadAbortException"异常
相当于你给他扔了块砖头强行砸死它...
最大的问题就是你后面还调用了个无参数的Join...它就得等着你原先DoEvents排队的那个消息结束.然而你又是个死循环..它永远也等不到确认这条线程挂了.



如果在代码中调用 DoEvents ,应用程序可以处理其他事件。 例如,如果有一个向 中添加数据 ListBox 并添加到 DoEvents 代码的窗体,则在将另一个窗口拖到该窗体上时,该窗体将重新绘制。 如果从代码中删除 DoEvents ,则在按钮的单击事件处理程序执行完毕之前,窗体不会重新绘制。

治标办法:办法1:Join里面传参数,比如1000,等1秒.一秒后就不等了(实际线程还活着).
办法1.5:  设置线程的 .IsBackground = true;这样它就是后台线程了.join时不会卡住主界面.
任务主线程 = new Thread(执行热血任务);
任务主线程.IsBackground = true;
任务主线程.Start();

办法2:
在弄个全局布尔变量,停止线程时死循环里面直接return出循环.这时候你整个流程其实是走完了的.即线程自身生命周期结束.再Abort和Join都是ok的.

治标治本: 搞明白线程到底是怎么回事.P7开始就是你要的线程控制.
C# 多线程与委托精讲_哔哩哔哩_bilibili


回复

使用道具 举报

结帖率:0% (0/2)

签到天数: 5 天

发表于 2023-9-7 16:35:17 | 显示全部楼层   山西省阳泉市
VS调试看哪里导致的呗 大概率线程安全没做好
回复

使用道具 举报

结帖率:63% (5/8)
 楼主| 发表于 2023-9-7 17:43:27 | 显示全部楼层   四川省德阳市
JueWar 发表于 2023-9-7 16:35
VS调试看哪里导致的呗 大概率线程安全没做好

大佬他也不报错和抛异常 所以才来请教
回复

使用道具 举报

结帖率:78% (7/9)

签到天数: 1 天

发表于 2023-9-7 18:06:42 | 显示全部楼层   广东省东莞市
线程调用控件得用委托,还有,Application.DoEvents删掉
回复

使用道具 举报

结帖率:100% (3/3)

签到天数: 1 天

发表于 2023-9-7 18:25:40 | 显示全部楼层   广东省汕头市
任务状态设为假
回复

使用道具 举报

结帖率:63% (5/8)
 楼主| 发表于 2023-9-8 15:26:16 | 显示全部楼层   四川省成都市
易行 发表于 2023-9-7 18:25
任务状态设为假

我在停止的时候已经设置成 假了 没用
回复

使用道具 举报

结帖率:63% (5/8)
 楼主| 发表于 2023-9-8 15:27:18 | 显示全部楼层   四川省成都市
初夏喔 发表于 2023-9-7 18:06
线程调用控件得用委托,还有,Application.DoEvents删掉

如果取消了 Application.DoEvents 死循环一旦开启就会卡死界面,加延迟会影响 任务执行的轮询进度
回复

使用道具 举报

结帖率:100% (5/5)

签到天数: 1 天

发表于 2023-9-9 12:57:53 | 显示全部楼层   湖北省潜江市
任务主线程.IsBackground  = true;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表