【问题标题】:BackgroundService with asp.net Core MVC 3.1带有 asp.net Core MVC 3.1 的 BackgroundService
【发布时间】:2020-04-25 13:49:38
【问题描述】:

这是我所做的:

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.AddHostedService<MyBatch>(); 
}


public class MyBatch : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stopToken)
    {
       while (!stopToken.IsCancellationRequested)
       {
            Console.Writeline("test");
            await Task.Delay(TimeSpan.FromSeconds(10));
       }
    }
}

我有两个问题:

  • 首先:当我启动“dotnet run”时,Web 应用程序在 5000 端口上没有响应。如果我删除我的批次,5000 端口将再次工作。 (测试信息显示在控制台上)

  • 第二:我想使用 Entity Framework 访问我的数据库。如何从此批处理文件访问我的数据库上下文?

谢谢

【问题讨论】:

  • not respond on 5000 port when i launch "dotnet run". If i remove my batch, the 5000 port works again 无法重现此问题,您可以在控制台分享日志截图,以便我们更好地理解。此外,您可以尝试创建一个新项目并检查是否出现同样的问题。

标签: asp.net-core-mvc


【解决方案1】:

我想使用 Entity Framework 访问我的数据库。如何从此批处理文件访问我的数据库上下文?

要从单例托管服务中使用范围服务(例如 DbContext 等),您可以创建一个范围,然后使用它来解析此范围中您需要的范围服务,如下所示。

public class MyBatch : BackgroundService
{

    public IServiceProvider Services { get; }
    public MyBatch(IServiceProvider services)
    {
        Services = services;
    }
    protected override async Task ExecuteAsync(CancellationToken stopToken)
    {
        while (!stopToken.IsCancellationRequested)
        {
            Console.WriteLine("test");

            await Task.Delay(TimeSpan.FromSeconds(10));

            await DoWithDb(stopToken);
        }
    }

    private async Task DoWithDb(CancellationToken stoppingToken)
    {
        //...

        using (var scope = Services.CreateScope())
        {
            var _myDbContext =
                scope.ServiceProvider
                    .GetRequiredService<MyDbContext>();



            //code logic here
            //...
        }
    }
}

您还可以从此处获取有关“在后台任务中使用范围服务”的详细信息:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio#consuming-a-scoped-service-in-a-background-task

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多