阻止线程在调用停止后进一步处理

本文关键字:进一步 处理 调用 线程 | 更新日期: 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 类将有多个队列。

注意:我无法更改操作队列。

  1. 中止方法是停止线程的正确方法吗?

  2. 如何停止所有线程(包括源代码创建的 Thread 类的所有实例(?

阻止线程在调用停止后进一步处理

通常你会创建一个这样的WaitHandle(例如ManualResetEvent(:

ManualResetEvent stopAllThreads = new ManualResetEvent(false);

因此,事件"未设置"。更改线程方法中的循环,以便它们循环,直到完成所有工作或设置手动重置事件。

while (!stopAllThreads.WaitOne(50))

或类似。

然后,在服务的 OnStop 方法中,您只需设置事件(不要忘记在 OnStart 中再次重置它,否则服务重新启动时线程将不会再次运行(:

stopAllThreads.Set();

并等待所有线程完成。

实际上,中止线程并不是停止线程的好方法 - 您应该始终选择上述方法。