我实现了三个BackgroundServices。第一个(x)被执行,但接下来的两个(y,z)没有被执行。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<x>();
services.AddHostedService<y>();
services.AddHostedService<z>();
}
所有三个BackgroundServices的实现如下:
public class x : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
func1();
}
}
}
当我在后台服务的实现中使用“try,catch”并且所有三个同时开始一起工作时,问题就解决了。
public class x : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
func1();
await Task.Delay(TimeSpan.FromDays(1));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
await Task.Delay(TimeSpan.FromSeconds(10));
}
}
}
}
但是我不知道为什么会出现这个问题。什么原因? 非常感谢任何愿意回答我的人。
发生这种情况是因为服务 x 同步运行并且永远不会返回。使用 try catch 时,您会等待 Task.Delay,这会使您的代码异步。
编辑:谢谢斯蒂芬·克利里的解释!
我认为这不是Try Catch。 func1 同步运行,因此 x.ExecuteAsync 同步循环,并且永远不会将句柄返回到 StartAsync 来运行 y.ExecuteAsync 和 z.ExecuteAsync。 当等待 Task.Delay 时,您将句柄返回到 StartAsync,它可以执行 y 和 z。