Запускает ли хранимая процедура через Entity Framework с Asyn c игнорирование context.timeout - PullRequest
2 голосов
/ 27 января 2020

Я пытаюсь найти учебник по запуску хранимой процедуры asyn c через EF, но не нашел подходящего.

У меня есть следующая функция, которая вызывает хранимую процедуру asyn c

  1. Является ли этот код действительно асинхронным c?
  2. Моя функция не работает из-за тайм-аута, почему EF заботится о тайм-ауте при асинхронной функции c?
  3. Может Я говорю EF игнорировать тайм-аут при использовании асин c функций?

Это мой код:

public async Task GenerateQueueAsync()    
{
    await Task.Run(() => ((MyEntities)_context).GenerateQueue());
}

1 Ответ

1 голос
/ 27 января 2020
  1. Нет, это не так.

  2. Так устроен EF! Одной из причин может быть предотвращение бесконечных тупиков. Но, как ответили в номере 3, вы можете изменить время ожидания.

  3. Вы можете установить контекст CommandTimeout в 0 в Entity Framework, чтобы он ожидал бесконечно долго. Чтобы установить это значение в разных версиях EF:

Entity Framework Core 2.0: Представлен IDesignTimeDbContextFactory:

public class SampleContextFactory : IDesignTimeDbContextFactory<SampleContext>
{
    public SampleContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<SampleContext>();
        optionsBuilder.UseSqlServer(
            @"Server=.\;Database=db;Trusted_Connection=True;", 
            opts => opts.CommandTimeout(0)
            );

        return new SampleContext(optionsBuilder.Options);
    }
}

И вы должен убедиться, что ваш контекст имеет конструктор, который принимает объект DbContextOptions в качестве параметра:

public SampleContext(DbContextOptions options) : base(options) { }

Entity Framework Core 1.0:

context.Database.SetCommandTimeout(0);

Entity Framework 6:

context.Database.CommandTimeout = 0;

Примечание Существующая возможность, предоставляемая EF для изменения тайм-аута выполнения запроса, не означает, что это должно быть сделано во всех случаях. Тайм-аут выполнения запроса должен быть установлен так, чтобы успешное выполнение большинства запросов могло быть гарантировано, а также настолько низким, что запросы не будут выполняться и тратить или даже в некоторых случаях блокировать ресурсы бесконечно.

Есть несколько вещей, которые вы можете сделать перед увеличением времени ожидания, например:

Оптимизация запросов:

Усовершенствование программного и аппаратного обеспечения хост-машины

Изменение таблиц базы данных для правильной индексации

В конце концов, согласно этому ответ с использованием async/await с EF является очень плохая идея для оптимизации производительности .

...