windows BackgroundService可以通过哪些方式停止?

inb24sb2  于 2023-03-31  发布在  Windows
关注(0)|答案(1)|浏览(443)

我使用.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可以通过哪些方式停止?显然,除了“优雅关闭”还有更多方法。还有哪些其他方法?这非常令人沮丧,因为现在看起来我的后台进程有时会神奇地停止。

yeotifhr

yeotifhr1#

处理此问题的方法是使用ExecuteAsync参数中的CancellationToken cancellationToken
您可以以各种方式使用此功能,在您的场景中,最简单的方法是检查它是否被取消。

foreach (var number in numbers)
{
    ....
    await Task.Delay(100, cancellationToken);
    .....

    if (cancellationToken.IsCancellationRequested) {
        break; // break in case of cancellation requested
    }
}

你也可以在不同类型的循环中使用它,像这样:

for (int i = 0; i < numbers.Length && !stoppingToken.IsCancellationRequested; i++) {
    ....
}

while (!stoppingToken.IsCancellationRequested) {
   ...
}

相关问题