Thread线程相关的问题

永远的小鱼 2019-07-16 03:33:52
因为业务关系 方法中 大量使用 new Thread(run).Start(); 来启动方法,该方法因为里面是死循环 所以经常导致程序无法完全退出 方法如下



public void run(){

while(true){
try
{
Console.WriteLine("123456");
}
catch (Exception e)
{
//终止当前线程
Console.WriteLine("-----------close thread----------");
if (e.GetType() == typeof(ThreadAbortException)) return;
}
}
Thread.Sleep(1000);
}


public void start(){

new Thread(run).Start();
new Thread(run).Start();
new Thread(run).Start();
.............

}


public void close(){

//这里如何关闭所有线程呢 已知 Thread ts = new Thread(run); ts.Abort(); 可以向线程抛出异常 停止线程
//在没有定义ts的情况下 我怎么获取程序中隐藏的 thread实例 并Abort给关闭呢

}
...全文
469 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_42254981 2019-07-28
  • 打赏
  • 举报
回复
System.Diagnostics.Process.GetCurrentProcess().Kill();
用这一句,什么都的退出。
恒_星 2019-07-26
  • 打赏
  • 举报
回复
线程池shutdownnow()
永远的小鱼 2019-07-25
  • 打赏
  • 举报
回复
引用 18 楼 失落的神庙 的回复:
看了我才知道不是死循环。是卡着了。这个需要优化卡的地方


卡的地方是因为程序正常运算导致的 不是BUG
失落的神庙 2019-07-23
  • 打赏
  • 举报
回复
看了我才知道不是死循环。是卡着了。这个需要优化卡的地方
失落的神庙 2019-07-23
  • 打赏
  • 举报
回复

bool stop=false;
public void run(){

while(!stop){

Console.WriteLine("123456");

Thread.Sleep(1000);
}

}
失落的神庙 2019-07-23
  • 打赏
  • 举报
回复
new Thread(run){isbackgroud=true}.Start();
Hack夜舞 2019-07-23
  • 打赏
  • 举报
回复
用线程池可以解决
datafansbj 2019-07-22
  • 打赏
  • 举报
回复
当阻塞代码正在执行时,你无法中断这个过程,除非这个阻塞代码你能控制(遇到标识就结束并返回),否则只能粗暴地结束这个线程。
橘子皮... 2019-07-20
  • 打赏
  • 举报
回复
所有线程参数设置1个canceltoken,设置关闭全体关闭,不过要让他自己关闭
永远的小鱼 2019-07-19
  • 打赏
  • 举报
回复
引用 6 楼 palhotel 的回复:
所有介绍线程的书籍都会说尽管提供了终止线程的方法,但是程序员在绝大部分情况下不要主动让线程结束,要让线程自己结束,你那里不是while true吗,把true改成一个静态变量,在外边改变它为false不就停止了吗?



目前就是这么做的 事实证明 如果 while(true)的时候 程序内部方法处于等待状态 根本就退不出去
Blean b = true;
while(b){

下载XML方法(如果网络延迟过大就会等待很久)

}

这时候修改b=false 程序就会卡主退不出去
永远的小鱼 2019-07-19
  • 打赏
  • 举报
回复
引用 5 楼 吹风的兔子 的回复:
给你的线程 加一个 属性:

Thread thread = new Thrad(()=>{ });
thread.IsBackground = true; //标记为一个后台线程,主线程结束时,这个线程会自动结束。


谢谢 我试试
永远的小鱼 2019-07-19
  • 打赏
  • 举报
回复
引用 3 楼 wanghui0380 的回复:
Environment.Exit(0)


这个方法经测试有时候关闭 会报windows错误,可能是游戏系统引用了很多第三方的dll
palhotel 2019-07-17
  • 打赏
  • 举报
回复
所有介绍线程的书籍都会说尽管提供了终止线程的方法,但是程序员在绝大部分情况下不要主动让线程结束,要让线程自己结束,你那里不是while true吗,把true改成一个静态变量,在外边改变它为false不就停止了吗?
OrdinaryCoder 2019-07-17
  • 打赏
  • 举报
回复
如果线程只在程序关闭的时候才结束 那么把IsBackground置成true 也就是后台线程 程序结束会自动结束该线程,如果在程序没关闭的时候就要关闭线程 那么使用标志的形式退出线程你值得拥有
howze 2019-07-17
  • 打赏
  • 举报
回复
Abort()方法是通过抛出异常的形式停止线程的,不够优雅,建议还是设置一个flag,通过bool类型变量来结束线程,如果你有很多线程操作,也可以考虑使用线程池,或者如果线程直接存在返回关系,也可以参考await方法
吹风的兔子 2019-07-16
  • 打赏
  • 举报
回复
给你的线程 加一个 属性: Thread thread = new Thrad(()=>{ }); thread.IsBackground = true; //标记为一个后台线程,主线程结束时,这个线程会自动结束。
stherix 2019-07-16
  • 打赏
  • 举报
回复
引用 2 楼 永远的小鱼 的回复:
[quote=引用 1 楼 stherix 的回复:] 最好还是保存建立的线程列表,或者传进去token 在需要的时候将token置位结束,让线程自己结束
winform中能直接获取当前串口里面的 隐藏变量列表吗 确实添加静态list是最简单的。。[/quote] 没有直接的方法 有第三方的库,也挺麻烦的
wanghui0380 2019-07-16
  • 打赏
  • 举报
回复
Environment.Exit(0)
永远的小鱼 2019-07-16
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
最好还是保存建立的线程列表,或者传进去token
在需要的时候将token置位结束,让线程自己结束




winform中能直接获取当前串口里面的 隐藏变量列表吗 确实添加静态list是最简单的。。
stherix 2019-07-16
  • 打赏
  • 举报
回复
最好还是保存建立的线程列表,或者传进去token 在需要的时候将token置位结束,让线程自己结束

110,538

社区成员

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

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

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