簡體   English   中英

使用 EF Core dbcontext 運行異步 select 時出錯

[英]Got error when run async select with EF Core dbcontext

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

我怎樣才能運行這樣的多項任務並擺脫該錯誤?

最簡單的方法是在每個任務中創建一個新的ApplicationDbContext object:

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 個任務可能會比其他方式執行得更差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM