【问题标题】:Got error when run async select with EF Core dbcontext使用 EF Core dbcontext 运行异步选择时出错
【发布时间】:2020-10-07 22:48:47
【问题描述】:
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.com/fwlink/?linkid=2097913。'

我怎样才能运行这样的多任务并摆脱该错误?

【问题讨论】:

    标签: c# asynchronous dbcontext ef-core-3.1


    【解决方案1】:

    最简单的方法是在每个任务中创建一个新的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 个任务可能会比其他方式执行得更差。

    【讨论】:

    • 问题是,在我的新 blazor 应用程序中,由于大量的依赖关系,很难使 ApplicationDbContext 瞬态。有什么建议吗?
    • 我帮不了你。我没有意识到你正在使用 Blazor。我从来没有使用过它。您可能应该在问题中提及这一点。
    猜你喜欢
    • 2021-01-21
    • 2019-02-28
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2019-02-10
    • 2021-11-23
    相关资源
    最近更新 更多