我目前正在研究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));
}
所以我在那里使用了一种取消令牌。就像我提到的那样,我的问题是:是 这是如何处理和结束服务中的线程,还是应该以完全不同的方式完成服务中的线程结束?
答案 0 :(得分:0)
这没关系,但请使用
volatile bool serviceFinished
因为否则编译器优化可能会替换您的
while (serviceFinished == false)
as
while (false)
欲了解更多信息,请阅读msdn volatile http://msdn.microsoft.com/en-us/library/x13ttww7.aspx