是什么保留了后台服务.是否要完成ExecuteAsync方法



我刚刚使用标准Visual Studio模板创建了一个Worker Service。在Worker类中,如果我移除while (!stoppingToken.IsCancellationRequested){...}包装并运行应用程序,那么ExecuteAsync永远不会完成。如果我将return添加到该方法的末尾,那么它仍然不完整。

有人能解释是什么让这种方法保持活力吗?

我想知道为什么在下面的代码中,ExecuteAsync不只是完成并拆除我的FileSystemWatcher?我可以一直触发观察程序,直到按下Ctrl+C取消令牌并停止整个应用程序。

protected override async Task ExecuteAsync(CancellationToken stoppingToken) =>
await Task.Run(async () =>
{
try
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
_watcher = new FileSystemWatcher(_settings.Value.FolderToWatch, "Transactions_????????.xml")
{
NotifyFilter = NotifyFilters.FileName
};
_watcher.Created += FileCreated;
_watcher.EnableRaisingEvents = true;
_logger.LogInformation("Monitoring folder '{watchedFolder}' for file drops...", _settings.Value.FolderToWatch);
}
catch (Exception e) when (False(() => _logger.LogCritical(e,"Fatal error.")))
{
throw;
}
});

BackgroundService不关心您的ExecuteAsync方法是否在关闭前完成。它只关心您的服务在服务器停止之前停止。

我建议您实现一个作业队列,在FileCreated方法中添加到队列中,并在ExecuteAsync方法中处理该队列。stoppingToken取消时返回。这样,您可以阻止服务器关闭,直到当前文件更改得到处理,或者传递取消令牌。

不要忘记Dispose((您的FileSystemWatcher。

最新更新