作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 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/
我只是在测试一些基本的 html 和 css 东西,当我遇到一个我根本无法解决的问题时。 文件: test2.html: Abschitt 1
我是一名优秀的程序员,十分优秀!