Azure 上的 .Net Core 后台服务作为 WebJob 不调用 StopAsync

.Net Core Background service on Azure as WebJob not calling StopAsync

我们有一个用 .Net Framework 编写的 Windows 服务,我们正在考虑移植到 .NET Core 和 Azure 中的 BackgroundService 运行ning。

我创建了样板 BackgroundService(Worker Service 项目模板)并将其作为 WebJob 部署到 Azure。

我们的服务在 运行 期间保持与第 3 方 API 的连接,因此我需要确保在 WebJob 停止时正常关闭此连接;是否停止 Azure 中的 WebJob,通过 VS 发布更新版本。

但是我发现,当我在 Azure 中停止 WebJob 时,不会调用 StopAsync 方法;相反,我在日志中得到了一个 ThreadAborted 异常。

当 运行 作为 WebJob 时,是否有正常关闭 BackgroundService 的最佳实践方法?

或者我什至应该为此使用其他一些 Azure 工具集吗?

如果这对任何人有帮助,我解决了这个问题,感谢您在 https://blog.amitapple.com/post/2014/05/webjobs-graceful-shutdown/#.YZNWEk5By3A and https://github.com/projectkudu/kudu/wiki/WebJobs#graceful-shutdown

的指点@HarshithaVeeramalla-MT
    private string _shutdownFile;

public Worker(ILogger<Worker> logger)
{            
    _logger = logger;

    _shutdownFile = Environment.GetEnvironmentVariable("WEBJOBS_SHUTDOWN_FILE");

    if (!string.IsNullOrEmpty(_shutdownFile))
    {
        _logger.LogInformation($"WebJob WEBJOBS_SHUTDOWN_FILE Environment Variable: {_shutdownFile}");

        var fileSystemWatcher = new FileSystemWatcher(Path.GetDirectoryName(_shutdownFile));
        fileSystemWatcher.Created += OnChanged;
        fileSystemWatcher.Changed += OnChanged;
        fileSystemWatcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.FileName | NotifyFilters.LastWrite;
        fileSystemWatcher.IncludeSubdirectories = false;
        fileSystemWatcher.EnableRaisingEvents = true;
    }
    else
    {
        _logger.LogWarning($"WebJob WEBJOBS_SHUTDOWN_FILE Environment Variable not found");
    }            
}

private void OnChanged(object sender, FileSystemEventArgs e)
{
    _logger.LogInformation($"Filechanged: {e.FullPath}");
    _logger.LogInformation($"WebShutDownFile: {_shutdownFile}");

    _logger.LogInformation($"FileName: {Path.GetFileName(_shutdownFile)}");

    if (e.FullPath.IndexOf(Path.GetFileName(_shutdownFile), StringComparison.OrdinalIgnoreCase) >= 0)
    {
        // Found the file mark this WebJob as finished
        _logger.LogInformation($"***WebJob shutdown file found - shutting down service***");
    }
}