本帖最后由 君临 于 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
|