首页 > 解决方案 > 在 ASP.NET Core 中请求结束后使用(DI 注入)DbContext

问题描述

对于我的 ASP.NET Core MVC 应用程序,我需要一个处理数据的控制器操作。此处理需要一些时间,所以我不想阻止请求。在控制器操作中,我宁愿启动一个后台工作程序并立即结束请求,告诉用户处理正在进行中。然后使用第二个控制器动作来访问处理过的数据。

在后台工作人员中,我需要访问DbContext以将处理后的数据存储在我的数据库中。(或通过依赖注入注入的任何其他服务。)我发现通过IServiceScopeFactory作品创建一个新的、独立于请求的范围,这反过来又给了我一个ServiceProvider

public class ProcessingController : Controller
{
    private readonly IServiceScopeFactory mServiceProvider;

    public HomeController(IServiceScopeFactory serviceProvider)
    {
        mServiceProvider = serviceProvider;
    }
    public IActionResult BeginProcessing(int id)
    {
        var longRunningScope = mServiceProvider.CreateScope();
        var _ = Task.Run(() => {
            try {
                var context = longRunningScope.ServiceProvider.GetRequiredService<DbContext>();
                var workItem = context.Items.First(i => i.Id == id) 
                ...
            }
            finally {
                longRunningScope.Dispose();
            }
        });
        return Ok();
    }
}

有没有更好(更多 ASP.NET-Core 风格)的方法来做到这一点?请注意,我的“长时间运行”操作只需要 2-5 秒,并且需要同时处理多个用户。不需要按顺序处理请求的后台线程。

标签: c#asp.net-core

解决方案


考虑将后台任务实现为托管服务

使用这种方法,可以管理后台服务的生命周期(如果托管环境正在关闭,运行时将通过 a 请求取消CancellationToken,而在您现有的代码中,您的任务不会被礼貌地停止)。


推荐阅读