不在 C# 中同时运行多个BackgroundServices

问题描述 投票:0回答:2

我实现了三个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));
                }
            }
        }
    }

但是我不知道为什么会出现这个问题。什么原因? 非常感谢任何愿意回答我的人。

c# asp.net-core background-service
2个回答
0
投票

发生这种情况是因为服务 x 同步运行并且永远不会返回。使用 try catch 时,您会等待 Task.Delay,这会使您的代码异步。

编辑:谢谢斯蒂芬·克利里的解释


0
投票

我认为这不是Try Catch。 func1 同步运行,因此 x.ExecuteAsync 同步循环,并且永远不会将句柄返回到 StartAsync 来运行 y.ExecuteAsync 和 z.ExecuteAsync。 当等待 Task.Delay 时,您将句柄返回到 StartAsync,它可以执行 y 和 z。

© www.soinside.com 2019 - 2024. All rights reserved.