Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行使用DbContext_C#_Entity Framework - Fatal编程技术网

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});

这比将一个上下文写入一个表然后再写入下一个表要快,但如果在同一个表上执行此操作,可能实际上比使用一个上下文执行此操作要慢。您的问题是什么?我的问题是,是否可以并行运行上面的代码段?因为现在它是同步运行的。是的,这是非常可能的,但您需要使用任务,这是一个异步检索数据的教程,应该有助于