我有一个用C#开发的Windows服务。在它的Start方法我有一个初始化,如:
Task _backgroundTask = null;
CancellationTokenSource _backgroundCancellationSource = null;
protected override void OnStart(string[] args)
{
......
_backgroundCancellationSource = new CancellationTokenSource();
CancellationToken token = backgroundCancellationSource.Token;
_backgroundTask = new Task(() => BackgroundFoldersProcessing(token), token, TaskCreationOptions.LongRunning);
.......
}
现在,BackgroundFoldersProcessing方法如下所示:
void BackgroundFoldersProcessing(CancellationToken token)
{
while (true)
{
try
{
if (token.IsCancellationRequested)
{
return;
}
DoSomeWork()
}
catch (Exception ex)
{
.........
}
}
}
现在,Stop方法如下:
protected override void OnStop()
{
.................
_backgroundCancellationSource.Cancel();
_backgroundTask.Wait();
_backgroundCancellationSource.Dispose();
_backgroundTask.Dispose();
_backgroundTask = null;
_backgroundCancellationSource = null;
.................
}
现在的问题是,当我尝试在处理过程中停止服务时,_backgroundTask的Wait方法不会停止服务,除非BackgroundFoldersProcessing中的DoSomeWork()方法完成,否则Windows服务不会停止
有没有办法,虽然DoSomeWork()方法是否已完成/执行,但我可以停止服务并终止_backgroundTask的执行?我还在BackgroundFoldersProcessing方法中尝试了token.ThrowIfCancellationRequested(),但这也没有用。我希望每当我尝试从服务控制管理器(SCM)停止服务时,应立即停止服务,__ backgroundTask应该停止执行BackgroundFoldersProcessing方法并终止。我怎样才能做到这一点?
答案 0 :(得分:0)
您可以尝试使用ThreadAbortException:
定义线程:
ThreadStart threadDelegate = new ThreadStart(BackgroundFoldersProcessing);
Thread thread_ = new Thread(threadDelegate);
thread_.Start();
将catch添加到BackgroundFoldersProcessing
catch (ThreadAbortException e)
{
return;
}
当你要关闭它时使用:
thread_.Abort();
thread_.Join();
然后当调用 Abort()时,将抛出ThreadAbortException。