在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。)
首先我有。但我无法跟踪正在运行的线程,也无法以阻止进程的方式杀死它们。在Windows服务停止的情况下,或者在检测到外部exe都挂起的情况下都没有。
从未与他们合作我们(我的团队)决定采取线程。我很高兴看到有关如何通过任务实现这一目标的建议。
答案 0 :(得分:1)
我认为需要改变
*End
到
public bool IsFinished() {
return _thread == null || _thread.IsAlive;
}