C# 并行使用DbContext
是否可以在实体框架的C# 并行使用DbContext,c#,entity-framework,C#,Entity Framework,是否可以在实体框架的DbContext中使用并行性?基本上,我有一个应用程序,为我拥有的4个表中的每一个添加数千条记录。我认为优化它的最好方法是并行添加记录 public void Transact() { var context = new DbContext(); _fooList = new List<Foo> { //… Assume that this list contains thousands of objects
DbContext
中使用并行性?基本上,我有一个应用程序,为我拥有的4个表中的每一个添加数千条记录。我认为优化它的最好方法是并行添加记录
public void Transact()
{
var context = new DbContext();
_fooList = new List<Foo>
{
//… Assume that this list contains thousands of objects
}
context.Set<Foo>().AddRange(_fooList);
var context1 = new DbContext();
_barList = new List<Bar>
{
//… Assume that this list contains thousands of objects
}
context1.Set<Bar>().AddRange(_barList);
context.SaveChanges();
context1.SaveChanges();
}
public void Transact()
{
var context=new DbContext();
_傻瓜=新列表
{
//…假设此列表包含数千个对象
}
context.Set().AddRange(\u傻瓜列表);
var context1=new DbContext();
_barList=新列表
{
//…假设此列表包含数千个对象
}
context1.Set().AddRange(_barList);
SaveChanges();
context1.SaveChanges();
}
请查看此StackOverflow线程:
DbContext不是线程安全的,但是可以为每个线程实例化一个新的。如果您使用任务等,请确保为每个任务实例化一个新的DbContext。这是非常可能的,而且速度更快(如果使用正确,稍后将详细介绍)
以下是您如何做到这一点:
var context1 = new DbContext();
_fooList = new List<Foo>
{
// Thousands of datasets
}
context1.Set<Foo>().AddRange(_fooList);
var context2 = new DbContext();
_barList = new List<Bar>
{
// Thousands of datasets
}
context2.Set<Bar>().AddRange(_barList);
var fooTask = context1.SaveChangesAsync();
var barTask = context2.SaveChangesAsync();
await Task.WhenAll(new Task[] {fooTask, barTask});
var context1=new DbContext();
_傻瓜=新列表
{
//数千个数据集
}
context1.Set();
var context2=new DbContext();
_barList=新列表
{
//数千个数据集
}
context2.Set().AddRange(_barList);
var fooTask=context1.SaveChangesAsync();
var barTask=context2.SaveChangesAsync();
wait Task.WhenAll(新任务[]{fooTask,barTask});
这比将一个上下文写入一个表然后再写入下一个表要快,但如果在同一个表上执行此操作,可能实际上比使用一个上下文执行此操作要慢。您的问题是什么?我的问题是,是否可以并行运行上面的代码段?因为现在它是同步运行的。是的,这是非常可能的,但您需要使用任务,这是一个异步检索数据的教程,应该有助于