Entity Framework 生成的上下文对象不是线程安全的。
如果我使用两个单独的实体上下文,每个线程一个(并在每个线程上调用 SaveChanges()
)会怎么样 - 这会是线程安全的吗?
// this method is called from several threads concurrently
public void IncrementProperty()
{
var context = new MyEntities();
context.SomeObject.SomeIntProperty++;
context.SaveChanges();
}
我相信 Entity Framework 上下文实现了某种“计数器”变量,它跟踪上下文中的当前值是否新鲜。
- 使用上面的代码 - 从单独的线程调用 - 我是否仍然需要锁定增量/保存更改?
- 如果是这样,在这个简单的场景中完成此任务的首选方法是什么?
最佳答案
在单个 Entity Framework 上下文上运行的多个线程不是线程安全的。
每个线程的单独上下文实例是线程安全的。只要每个执行线程都有自己的 EF 上下文实例,就可以了。
在您的示例中,您可以同时从任意数量的线程调用该代码,并且每个线程都会愉快地使用自己的上下文。
但是,我建议为此实现一个“using” block ,如下所示:
// this method is called from several threads concurrently
public void IncrementProperty()
{
using (var context = new MyEntities())
{
context.SomeObject.SomeIntProperty++;
context.SaveChanges();
}
}
关于c# - Entity Framework 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4455634/