c# - 在 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 秒,并且需要同时处理多个用户。不需要按顺序处理请求的后台线程。
解决方案
考虑将后台任务实现为托管服务。
使用这种方法,可以管理后台服务的生命周期(如果托管环境正在关闭,运行时将通过 a 请求取消CancellationToken
,而在您现有的代码中,您的任务不会被礼貌地停止)。
推荐阅读
- javascript - 访问请求标头时未定义
- r - R vegan vegdist 不计算大多数地块之间的距离
- sql-server - PowerBI - 附加文件
- excel - VBA Excel 将图片和图表导出到 Word 书签
- swagger - 如何让 Springfox Swagger 将我的 @ApiParam 列为对象,而不是将其各个成员列为参数,就好像它们都是参数一样?
- json - 如何从salesforce apex的主控制器访问包装类下的类列表
- python - 如何最好地在 Python 中实现部门、组和股票的分类
- reactjs - CoreUI 图表类型 Bar- 可点击的条形链接到另一个页面
- python-3.x - 如果计数少于使用python的预期,我如何计算并将数字添加到特定位置?
- sql - SQL 匹配和提取关键字