【发布时间】:2020-02-20 00:41:44
【问题描述】:
我正在开发一个 Web 应用程序来处理大量数据并使用这些项目创建一个 .csv 文件。
到目前为止,一切都很好,但是,我发现这个过程并不是很快,所以我决定在任务(线程)中完成所有这些事情。
像这样:
_ = Task.Run(() => {
try
{
LetsGoCrazy(model);
}
catch (Exception ex)
{
SaveLog(model, "Error dumbass", ex);
}
});
我的问题是,如何在任务方法中更新我的数据库(实体框架核心)?
因为,它向我显示了这个异常:
System.ObjectDisposedException: '无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。
我相信它必须有另一种方法来实现这一点,而无需在任务中重新创建实体框架上下文。
【问题讨论】:
-
你的代码是 fire-and-forget
Task,你的代码的其他部分对此一无所知。您只需要await从Task.Run()返回的任务。在没有看到你的代码的情况下,仅仅将它放在一个子任务中并不一定会让它运行得更快 -
@MichaelRandall 哈哈我确实喜欢你的类比 :)
-
奇怪的类比,但有道理兄弟哈哈。我不能让用户等待任务完成。他们最终会收到一封包含该文件的电子邮件
-
您可能需要某种消息队列服务来处理进程外的
LetsGoCrazy。
标签: c# multithreading task dispose