Thread.IsAlive 和 Thread.ThreadState==ThreadState.Running 线程是否存活和线程状态为运行状态的判断。

14

我正在使用 if(Thread.IsAlive) 来检查线程的状态。在这个线程中有一个窗体运行。执行过程中,有时即使窗体仍然打开,调用Thread.IsAlive似乎会评估为false。我考虑使用相同的检查方式 if(Thread.ThreadState==ThreadState.Running),这样做正确吗?如果不是,有什么可能的解决方法?


@daveL:我也讨厌说它似乎是这样的。但问题是,我可以在我的桌面上看到正在运行的线程上的表单,但 thread.isalive 代码没有得到执行。 - Victor Mukherjee
1
似乎@daveL很难处理模棱两可的事情,至少看起来是这样... :p - kingdango
1个回答

18

MSDN Thread.IsAlive 属性

如果该线程已启动并且没有正常或非正常终止,则为 true;否则为 false。

MSDN Thread.ThreadState

  • Running(运行中)
    该线程已经启动,未被阻塞,并且不存在未处理的 ThreadAbortException 异常。
  • StopRequested(请求停止)
  • SuspendRequested(请求挂起)
  • Background(后台线程)
  • Unstarted(未启动)
  • WaitSleepJoin(等待、睡眠、加入)
  • Suspended(已挂起)
  • AbortRequested(请求中止)

我认为现在很清楚了,Running 不同于 IsAlive


7
当你启动一个线程时,IsAlive通常很有用。如果(!thread.IsAlive),就启动线程(thread.Start())。使用IsAlive来判断线程是否正在运行并不安全,因为在未启动和已启动之间有许多状态不等于正在运行。实际上,IsAlive只是告诉你不要再次尝试启动它。 - kingdango
3
定期检查线程是否退出是一种安全的方法吗? - Bill Greer
挂起不再是一个有效的线程状态。有人可以推荐一个替代方案吗? - user2924019

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接