1

我有一个 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。

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

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

4

1 回答 1

1

通常你会创建一个WaitHandleManualResetEvent例如)这样的:

ManualResetEvent stopAllThreads = new ManualResetEvent(false);

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

while (!stopAllThreads.WaitOne(50))

或类似的。

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

stopAllThreads.Set();

并等待所有线程完成。

实际上,中止线程并不是停止线程的好方法——你应该总是选择类似上面的方法。

于 2012-05-11T08:02:28.087 回答