【发布时间】:2015-07-29 22:00:39
【问题描述】:
我在 ASP.NET MVC 中使用 EF 6。我在后台运行一些任务,所以我使用新的 EF 上下文和 Task 类来执行它。异步任务分为 3 个较小的任务,它们也应该在同一个数据库事务中运行异步。我不能使用 SaveAsync,因为我的代码是从同步和异步上下文中调用的。
Task.Run(() =>
{
try
{
using (var transaction = dbContext.Database.BeginTransaction())
{
CalculateAmounts(id);
transaction.Commit();
}
}
finally
{
dbContext.Dispose();
}
});
CalculateAmounts 方法创建了另外 3 个任务。我应该如何处理交易?
另一方面,当任务协同工作时,我遇到了一些错误,例如 DataReader 已经打开。我应该为每个任务创建一个上下文吗?在那种情况下,如何使它们都成为同一事务的一部分?
【问题讨论】:
-
Task.Run在 ASP.NET 应用程序中几乎从来都不是一个好主意。您要么正在执行无法保证在 AppDomain 关闭之前完成的任务,要么只是增加了开销并降低了网站的可扩展性。 -
如果您考虑长期运行的任务,我认为您的评论是正确的。我说的是不到 10 秒的任务。如果 AppDomain 关闭,在任何情况下都将是一场灾难(仅在一个线程或多个线程中执行)。
标签: c# entity-framework asynchronous