使用EF Core dbcontext运行异步选择时出现错误。

问题描述 投票:1回答:2
public class Person 
{
    [Key]
    public Guid Id { get; set; }
    public string FullName { get; set; }
}

public class ApplicationDbContext : DbContext 
{
    public DbSet<Person> People { get; set; }
}

public class Program 
{
    public void Main() 
    {
        using var context = new ApplicationDbContext(*configuration here*);
        var doWorks = Enumerable.Range(0, 1000).Select(x => context.People.AsNoTracking().ToArrayAsync());
        await Task.WhenAll(doWorks);
    }
}

我得到这个错误。

System.InvalidOperationException: '在前一个操作完成之前,在这个上下文上启动了第二个操作。这通常是由不同线程使用同一个DbContext实例引起的。关于如何避免使用DbContext的线程问题的更多信息,请参阅 https:/go.microsoft.comfwlink?linkid=2097913。.'

如何才能运行这样的多任务,摆脱这个错误?

c# asynchronous dbcontext ef-core-3.1
2个回答
0
投票

最简单的方法是创建一个新的 ApplicationDbContext 对象在每个任务中。

public class Program {
    public void Main() {
        var doWorks = Enumerable.Range(0, 1000).Select(async x => {
                          using var context = new ApplicationDbContext(*configuration here*);
                          await context.People.AsNoTracking().ToArrayAsync();
                      });
        await Task.WhenAll(doWorks);
    }
}

注意我把你的lambda async 并使用 await. 否则,上下文会在查询结束前被处理掉。

如果你是作为一个负载测试来做的,那就没问题。只是要注意,在某些情况下,同时执行1000个任务可能会比其他方式表现得更差。

© www.soinside.com 2019 - 2024. All rights reserved.