阻止线程在调用停止后进一步处理
本文关键字:进一步 处理 调用 线程 | 更新日期: 2023-09-27 18:33:47
我有一个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 方法将分别调用引擎类的 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 方法将分别调用引擎类的 Start 和 Stop 方法。
我想要的是当Windows服务停止时,所有正在运行的线程都应该停止其处理/执行。
但是,这里发生的事情是在 StartTask 方法中创建新的线程实例时,当我调用 _任务。ForEach(task => task。中止(((我没有正确的线程实例,即所有实例 _thread = 新线程(....(;未被访问,因为同一 PerformTask 类将有多个队列。
注意:我无法更改操作队列。
中止方法是停止线程的正确方法吗?
如何停止所有线程(包括源代码创建的 Thread 类的所有实例(?
通常你会创建一个这样的WaitHandle
(例如ManualResetEvent
(:
ManualResetEvent stopAllThreads = new ManualResetEvent(false);
因此,事件"未设置"。更改线程方法中的循环,以便它们循环,直到完成所有工作或设置手动重置事件。
while (!stopAllThreads.WaitOne(50))
或类似。
然后,在服务的 OnStop
方法中,您只需设置事件(不要忘记在 OnStart
中再次重置它,否则服务重新启动时线程将不会再次运行(:
stopAllThreads.Set();
并等待所有线程完成。
实际上,中止线程并不是停止线程的好方法 - 您应该始终选择上述方法。