我使用.NET 6开发了一个REST API。这个API(在Windows服务器系统上运行)通过实现从BackgroundService
类继承的类来实现后台进程。我自己实现的这个类的唯一方法是ExecuteAsync
。它有一个包含使用cancellationToken的延迟的循环。
public async Task ExecuteAsync(CancellationToken cancellationToken)
{
try
{
.....
foreach (var number in numbers)
{
....
await Task.Delay(100, cancellationToken);
.....
}
.....
}
catch (Exception e)
{
........
_logger.LogError(e.GetBaseException(),"Failed processing requested numbers");
throw;
}
}
从日志(捕获的异常)中可以清楚地看出,取消令牌用于取消进程。根据the documentation,这意味着“正常关闭”。然而,从日志中也可以清楚地看出,应用程序只是继续运行(之后记录了大量请求)。逻辑上,“关闭”会影响整个应用程序,但这根本不会发生。
因此,BackgroundService可以通过哪些方式停止?显然,除了“优雅关闭”还有更多方法。还有哪些其他方法?这非常令人沮丧,因为现在看起来我的后台进程有时会神奇地停止。
1条答案
按热度按时间yeotifhr1#
处理此问题的方法是使用
ExecuteAsync
参数中的CancellationToken cancellationToken
。您可以以各种方式使用此功能,在您的场景中,最简单的方法是检查它是否被取消。
你也可以在不同类型的循环中使用它,像这样:
或