【发布时间】:2014-01-23 15:54:21
【问题描述】:
我经常使用 async/await 来确保 ASP.NET MVC Web API 线程不会被长时间运行的 I/O 和网络操作(特别是数据库调用)阻塞。
System.Data.Entity 命名空间在这里提供了各种辅助扩展,例如FirstOrDefaultAsync、ContainsAsync、CountAsync 等等。
但是,由于数据上下文不是线程安全的,这意味着下面的代码是有问题的:
var dbContext = new DbContext();
var something = await dbContext.someEntities.FirstOrDefaultAsync(e => e.Id == 1);
var morething = await dbContext.someEntities.FirstOrDefaultAsync(e => e.Id == 2);
事实上,我有时会看到以下异常:
System.InvalidOperationException: 连接未关闭。连接的当前状态是打开的。
然后为 each 对数据库的异步调用使用单独的 using(new DbContext...) 块是正确的模式吗?那么只执行同步是否可能更有益?
【问题讨论】:
标签: c# .net multithreading entity-framework async-await