使用IsAlive检查线程是否完成失败

时间:2017-07-19 14:30:15

标签: c# multithreading

在C#项目中,我有一个类(ThreadSpawner),它生成线程并在列表中跟踪它们(_runningJobs)。如果线程已完成,则应从此列表中删除它们。

到目前为止,我尝试使用Thread.IsAlive属性,但这并不起作用,因为它似乎总是正确的,永远不会变错。

我想在IsFinished方法中检查的是,如果线程已经死了并且不再运行,我认为当DoJob方法离开时会自动发生。

任何提示如何检查它们?

我不知道哪个线程状态说线程不再存在......

我的(示例)代码:

  public class ThreadSpawner {

  private List<SpawnedThread> _runningJobs;
  private bool _isStopRequested;
  private int maxRunningJobs = 3;
  private Thread _thread; 

  public ThreadSpawner() {
    _runningJobs = new List<SpawnedThread>();
    _isStopRequested = false;
    _thread = null;
  }

  public void Start() {
    _thread = new Thread(DoJob);
    _thread.Start();
  }

  public void DoJob() {
    while(!_isStopRequested) {

      //check if there are finished jobs in the list and remove them if they are finished
      for (int i = _runningJobs.Count-1; i >= 0; i--) {
        if (_runningJobs.ElementAt(i).IsFinished()) {
            _runningJobs.RemoveAt(i);
        }
      }

      //spawn threads if possible and required
      if (_runningJobs.Count less maxRunningJobs && ShouldThreadBeSpawned()) {
        SpawnedThread st = new SpawnedThread();
        _runningJobs.Add(st);
        st.Start();
      }

      Thread.Sleep(100);
    }
  }

  public void Stop() {
    _isStopRequested = true;

    for (int i = 0; i less _runningJobs.Count; i++) {
      _runningJobs.ElementAt(i).Stop();
    }
  }

  public bool IsFinished() {
    return _thread == null || ( _runningJobs.Count == 0 && _thread.IsAlive);
  }

  private bool ShouldThreadBeSpawned() {
    return true; //actually whatever the criteria says
  }
}

public class SpawnedThread {

  private bool _isStopRequested;
  private Thread _thread; 

  public ThreadSpawner() {
    _isStopRequested = false;
    _thread = null;
  }

  public void Start() {
    _thread = new Thread(DoJob);
    _thread.Start();
  }

  public void DoJob() {
    // does whatever it should do
    // and leaves the DoJob method
    // and I assumed when this method is left IsAlive would become false but it doesn't
  }

  public void Stop() {
    _isStopRequested = true;
  }

  public bool IsFinished() {
    return _thread == null || _thread.IsAlive;
  }

}

精炼问题

如何启动线程/任务,可以跟踪正在运行的线程/任务并能够通过代码停止它们(可能会为每个线程/任务调用一些代码来停止包含的进程)?

更多细节

整个系统用于(.NET Core)Windows服务(请参阅我的其他问题)。 Windows服务启动ThreadSpawner。 ThreadSpawner查询数据库以查找要执行的作业。对于每个作业,它产生一个SpawnedThread。该线程从数据库中查询另一组数据,通过网络获取一些文件。然后,SpawnedThread(一个接一个)启动一些进程调用可执行文件,并将结果从一个可执行文件传递给下一个可执行文件调用。然后放回生成的文件并将结果存储在数据库中。

一切正常,但问题是我无法弄清楚如何在Windows服务停止时判断线程是否正在运行,并以同样停止进程的方式终止生成的线程。 (同样的机制也用于检查被调用的exe是否挂起并使用其进程和SpawnedThread终止挂起的exe。)

为什么我没有使用ThreadPool和ThreadPool.QueueUserWorkItem

首先我有。但我无法跟踪正在运行的线程,也无法以阻止进程的方式杀死它们。在Windows服务停止的情况下,或者在检测到外部exe都挂起的情况下都没有。

为什么我没有使用任务

从未与他们合作我们(我的团队)决定采取线程。我很高兴看到有关如何通过任务实现这一目标的建议。

1 个答案:

答案 0 :(得分:1)

我认为需要改变

*End

 public bool IsFinished() {
    return _thread == null || _thread.IsAlive;
  }