求助 线程为什么会被自动销毁?

adam_gin 2019-05-16 11:39:21
用一个线程循环去读一些信息,然后把符合条件的信息通过事件反馈出去,但是这个线程每次跑个两次就消失了,从任务管理器里看线程数少了一个,断点循环位置也进不去了

Task.Factory.StartNew(GetValue);

void GetValue()
{
while (true)
{
Thread.Sleep(200);
try
{
var status = tcpNet.ReadInt16("3").Content;
if (status == (short)1)
{
float weightValue = tcpNet.ReadFloat("0").Content;
if (weightValue == _lastValue)
{
return;
}
ReverseWeightEvent?.Invoke(weightValue);
_lastValue = weightValue;
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}

}
...全文
245 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2019-05-16
  • 打赏
  • 举报
回复
查看下windows日志,追究下具体原因
正怒月神 2019-05-16
  • 打赏
  • 举报
回复
你的线程出现异常了。 这个时候,你检查一下数据
wanghui0380 2019-05-16
  • 打赏
  • 举报
回复
throw new Exception(e.Message); 对啊,你自己抛异常了,线程异常就自退啊,很正常啊
wanghui0380 2019-05-16
  • 打赏
  • 举报
回复
引用 7 楼 adam_gin 的回复:
[quote=引用 1 楼 wanghui0380 的回复:] throw new Exception(e.Message); 对啊,你自己抛异常了,线程异常就自退啊,很正常啊
问题是没有抛出异常[/quote] 线程异常不会有提示的,他会自己退的。比如你用vs调试,你啥异常都没看到,但是vs的输出会输出给你一堆“xxxx线程退出”(当然这里的提示只是说是退出,可能是正常完成退出,也可能是异常退出)
adam_gin 2019-05-16
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
throw new Exception(e.Message);

对啊,你自己抛异常了,线程异常就自退啊,很正常啊


问题是没有抛出异常
猫爪子挠 2019-05-16
  • 打赏
  • 举报
回复
添加打印日志,推荐log4net,把成功和失败的日志都打出来,可以清晰的看出问题出现在哪里……
weixin_35107932 2019-05-16
  • 打赏
  • 举报
回复
首先你要了解C#的线程机制,以及线程工作模式,C#中,线程也是一种对象,这种对象也是具有各种形态的,GC在管理这些资源的时候,会预测将来的形态,从伊甸园态到幼年态,从幼年态到年轻态,从年轻态到老年态,从老年态到死亡态,这些状态的改变要根据你使用情况来把握的。并且还需要了解同步异步阻塞非阻塞的模式才能完成整个线程的使用。
exception92 2019-05-16
  • 打赏
  • 举报
回复
使用CancellationToken 对象能更好的控制线程的退出。并且此时的线程并未销毁,它的销毁由thread pool 去控制,每个线程会再使用完毕之后休眠一段时间,不再使用就会销毁。 任务管理器中的线程并不能代表“真实”的线程数。

110,533

社区成员

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

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

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