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

时间:2014-07-22 14:26:39

标签: c# multithreading service

我目前正在研究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));
    }

所以我在那里使用了一种取消令牌。就像我提到的那样,我的问题是:是 这是如何处理和结束服务中的线程,还是应该以完全不同的方式完成服务中的线程结束?

1 个答案:

答案 0 :(得分:0)

这没关系,但请使用

volatile bool serviceFinished

因为否则编译器优化可能会替换您的

while (serviceFinished == false)

as

while (false)

欲了解更多信息,请阅读msdn volatile http://msdn.microsoft.com/en-us/library/x13ttww7.aspx