Получена ошибка при запуске asyn c select с EF Core dbcontext - PullRequest
1 голос
/ 18 июня 2020
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. '

Как я могу запустить несколько таких задач и избавиться от этой ошибки?

1 Ответ

0 голосов
/ 18 июня 2020

Самый простой способ - создать новый объект 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);
    }
}

Обратите внимание, я сделал вашу лямбду async и использовал await. В противном случае контекст будет удален до завершения запроса.

Если вы делаете это как нагрузочный тест, ничего страшного. Просто имейте в виду, что в некоторых случаях выполнение 1000 задач одновременно может работать хуже, чем другие способы.

...