我有一个 Windows 服务,它将启动和停止某些进程的执行,这些进程正在使用持有的线程完成。
我有两个类如下:
public class PerformTask
{
Thread _thread = null;
public void StartTask()
{
_thread = new Thread(new ThreadStart(DoSomeWork));
_thread.Start();
}
public void DoSomeWork()
{
// Do Some Work
_thread = null;
}
public void Abort()
{
if (_thread != null)
{
try
{
_thread.Abort();
}
catch (ThreadAbortException) {}
}
}
}
public class Engine
{
List<PerformTask> _task = new List<PerformTask>();
public void Start()
{
var task = new PerformTask();
_task.Add(task);
// Add task to the timed action queue
_actionQueue.Add(s => task.StartTask(), TimeSpan.FromSeconds(10));
}
public void Stop()
{
_task.ForEach(task => task.Abort());
_task.Clear();
_actionQueue.Stop();
_actionQueue.Clear();
}
}
_actionQueue 是一个自定义源代码,用于在指定的重复时间间隔执行指定的操作。所有动作都保留在队列中,并在指定的时间间隔内调用。
现在,Windows 服务的 OnStart 和 OnStop 方法将分别调用 Engine 类的 Start 和 Stop 方法。
我想要的是当 Windows 服务停止时,所有正在运行的线程都应该停止它们的处理/执行。
但是,这里发生的事情是在创建新线程实例时,我有一个 Windows 服务,该服务将启动和停止某些进程的执行,该进程正在使用持有的线程完成。
我有两个类如下:
public class PerformTask
{
Thread _thread = null;
public void StartTask()
{
_thread = new Thread(new ThreadStart(DoSomeWork));
_thread.Start();
}
public void DoSomeWork()
{
// Do Some Work
_thread = null;
}
public void Abort()
{
if (_thread != null)
{
try
{
_thread.Abort();
}
catch (ThreadAbortException) {}
}
}
}
public class Engine
{
List<PerformTask> _task = new List<PerformTask>();
ActionQueue _actionQueue = new ActionQueue();
public void Start()
{
foreach(.....)
{
var task = new PerformTask();
_task.Add(task);
// Add task to the timed action queue
_actionQueue.Add(s => task.StartTask(), TimeSpan.FromSeconds(10));
}
_actionQueue.Start();
}
public void Stop()
{
_task.ForEach(task => task.Abort());
_task.Clear();
_actionQueue.Stop();
_actionQueue.Clear();
}
}
ActionQueue 是一个自定义的源代码,用于在指定的重复时间间隔执行指定的操作。所有动作都保留在队列中,并在指定的时间间隔内调用。
现在,Windows 服务的 OnStart 和 OnStop 方法将分别调用 Engine 类的 Start 和 Stop 方法。
我想要的是当 Windows 服务停止时,所有正在运行的线程都应该停止它们的处理/执行。
但是,这里发生的是在 StartTask 方法中创建新线程实例时,当我调用 _task.ForEach(task => task.Abort()) 我没有正确的 Thread 实例,这就是所有实例_thread = new Thread(....); 没有被访问,因为同一个 PerformTask 类会有多个队列。
注意:我无法更改 ActionQueue。
Abort 方法是停止线程的正确方法吗?
如何停止所有线程(包括源代码创建的 Thread 类的所有实例)?