gpt4 book ai didi

c# - 后台任务——如何以可控的方式停止?

转载 作者:行者123 更新时间:2023-11-30 15:32:25 25 4
gpt4 key购买 nike

我正在开发一个 WPF 应用程序,它将有一个作为后台任务运行的“索引服务”。索引服务将利用监视文件夹的 FileSystemWatcher - 当文件更改时,索引服务将读取文件内容并更新索引(我使用的是 Lucene.Net)。我的索引服务是单例的,将在应用程序启动期间启动,如下所示:-

new TaskFactory().StartNew(_indexingService.StartService);

StartService() 方法看起来像这样:-

private readonly ManualResetEvent _resetEvent = new ManualResetEvent(false);

public void StartService()
{
var watcher = new FileSystemWatcher
{
// Set the properties
};
watcher.Changed += UpdateIndexes();

_resetEvent.WaitOne();
}

当应用程序关闭时,我打算调用这个方法,据我所知这将结束索引服务后台任务:-

public void StopService()
{
_resetEvent.Set();
}

首先,这是启动和停止应在应用程序的生命周期内运行的后台任务的正确“模式”吗?

其次,这次关闭有多“优雅”?假设观察者 Changed 事件处理程序已触发并遍历文件、读取文件并更新索引。如果任务已停止,此处理会在流程中途中止,还是事件处理程序方法会先运行完成?

最佳答案

您可以使用取消 token :

  CancellationTokenSource CancelationToken = new CancellationTokenSource();
new TaskFactory().StartNew(_indexingService.StartService,CancelationToken,
TaskCreationOptions.LongRunning)
.ContinueWith(TaskCancelationCallBack,TaskContinuationOptions.OnlyOnCanceled);

您可以在应用程序的任何位置使用以下方式取消 token :

 CancellationTokenSource.Cancel();

您可以检查您的 token 是否被取消,并从内部向任务抛出取消异常:

if (CancelationToken.IsCancellationRequested) {    

CancelationToken.Token.ThrowIfCancellationRequested();
}

您可以在 ContinueWith 回调中获取任务状态:

private void TaskCancelationCallBack(System.Threading.Tasks.Task task)
{
if (task.Status == System.Threading.Tasks.TaskStatus.Canceled)
{
//Canceled
}
}

编辑:在这种情况下,我们使用了 TaskContinuationOptions.OnlyOnCanceled,因此不需要检查 TaskCancelationCallBack。它只会在那个前提下被解雇。

关于c# - 后台任务——如何以可控的方式停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19154432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com