C# 用于结束工作线程的服务中的OnStop方法

C# 用于结束工作线程的服务中的OnStop方法,c#,multithreading,service,C#,Multithreading,Service,我目前正在研究c#下的服务,并研究了如何对OnStart进行编程(使用工作线程以便OnStart不会阻塞)。 现在我想知道的是,在调用OnStop时,工作线程(如果它们是无止境的循环)应该如何停止。据我所知,Thread.Abort是一个非常糟糕的做法,我的第一个想法是使用取消令牌,如本例所示: Class MyServiceClass : ServiceBase { ...... bool serviceFinished; Thread worker; pro

我目前正在研究c#下的服务,并研究了如何对OnStart进行编程(使用工作线程以便OnStart不会阻塞)。 现在我想知道的是,在调用OnStop时,工作线程(如果它们是无止境的循环)应该如何停止。据我所知,Thread.Abort是一个非常糟糕的做法,我的第一个想法是使用取消令牌,如本例所示:

Class MyServiceClass : ServiceBase
{
    ......
    bool serviceFinished;
    Thread worker;

    protected void OnStart(string[] args)
    { 
       serviceFinished = false;
       worker = new Thread (MyFunction);
       worker.Name = "MyFunctionWorker";
       worker.IsBackground = false;  //This is important to set!
       worker.Start();
    }

    private void MyFunction()
    {
        while (serviceFinished == false)
        {
             ..... // Do whatever I want to do in this function
        }
    }

    protected override void OnStop()
    {
        serviceFinished = true;
        worker.Join(new TimeSpan(0,2,0));
    }
所以我用了一种取消代币。现在就像我提到的,我的问题是:是吗
这是如何处理和结束服务中的线程,还是应该以完全不同的方式结束服务中的线程?

这是可以的,但请使用

volatile bool serviceFinished
因为否则编译器优化可能会取代您的

while (serviceFinished == false)
作为


有关更多信息,请阅读msdn volatile

使用取消令牌的
CancellationToken
类。不要只使用布尔变量。是的,就是这样@Servy:在这种情况下,volatile bool字段不起作用有什么原因吗?@Servy有什么特殊情况使类比(volatile)boolean更适合吗?@Groo您应该避免使用非常低级的功能,因为这不一定是一个简单的问题。“这可能很好,但使用专门为工作设计的工具更容易、更安全,这样你就可以知道它是好的。”托马斯。对它是专门为完成这项任务而设计的。它传达您需求的确切语义,确保线程之间数据的正确同步,等等。编译器可能会缓存该值,但它肯定不会完全删除该表达式。@user2126375 volatile的优点!我完全忽略了这件事。格罗-看,我写的是关于类似问题的文章。
while (false)