如何取消任务或立即终止任务执行?

时间:2012-03-12 08:31:43

标签: c#-4.0 task

我有一个用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方法并终止。我怎样才能做到这一点?

1 个答案:

答案 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。