Основы сущность метода SaveChanges() и SaveChangesAsync() и найти() и FindAsync()



Я искал различия между двумя парами выше, но не нашел никаких статей, объясняющих четко об этом, а также Когда использовать тот или иной.



так в чем разница между SaveChanges() и SaveChangesAsync()?

И между Find() и FindAsync()?



на стороне сервера, когда мы используем Async методы, нам также нужно добавить await. Таким образом, я не думаю, что это асинхронно на стороне сервера.



это только помогает предотвратить пользовательский интерфейс блокировка на стороне клиента браузера? Или есть какие-то плюсы и минусы между ними?

801   2  

2 ответов:

каждый раз, когда вам нужно выполнить действие на удаленном сервере, ваша программа генерирует запрос, отправляет его, а затем ждет ответа. Я буду использовать SaveChanges() и SaveChangesAsync() в качестве примера, но то же самое относится к Find() и FindAsync().

скажем, у вас есть список myList из 100 + элементов, которые необходимо добавить в базу данных. Чтобы вставить это, ваша функция будет выглядеть примерно так:

using(var context = new MyEDM())
{
    context.MyTable.AddRange(myList);
    context.SaveChanges();
}

сначала вы создаете и экземпляр MyEDM добавить список myList to в таблице MyTable, тогда звоните SaveChanges() для сохранения изменений в базе данных. Он работает так, как вы хотите, записи поступают, но ваша программа не может сделать ничего другого, пока фиксация не закончится. Это может занять много времени в зависимости от того, что вы совершаете. Если вы фиксируете изменения в записях, entity должен фиксировать их по одному за раз (у меня когда-то было сохранение 2 минут для обновлений)!

чтобы решить эту проблему, вы можете сделать одну из двух вещей. Во-первых, вы можете начать вверх по новой резьбе для обработки вставки. Хотя это освободит вызывающий поток для продолжения выполнения, вы создали новый поток, который просто будет сидеть там и ждать. Нет необходимости в том, что накладные расходы, и это async await шаблон решает.

для операций ввода / вывода,await быстро станет вашим лучшим другом. Взяв раздел кода сверху, мы можем изменить его следующим образом:

using(var context = new MyEDM())
{
    Console.WriteLine("Save Starting");
    context.MyTable.AddRange(myList);
    await context.SaveChangesAsync();
    Console.WriteLine("Save Complete");
}

это очень небольшое изменение, но есть глубокое воздействие на эффективность и производительность вашего кода. Так что же происходит? Начало кода то же самое, вы создаете экземпляр MyEDM и добавить myList до MyTable. Но когда вы звоните await context.SaveChangesAsync(), код возвращается к вызывающей функции! поэтому, пока вы ждете фиксации всех этих записей, ваш код может продолжать выполняться. Скажем, функция, содержащая приведенный выше код, имела подпись public async Task SaveRecords(List<MyTable> saveList), вызывающая функция может выглядеть так это:

public async Task MyCallingFunction()
{
    Console.WriteLine("Function Starting");
    Task saveTask = SaveRecords(GenerateNewRecords());

    for(int i = 0; i < 1000; i++){
        Console.WriteLine("Continuing to execute!");
    }

    await saveTask;
    Console.Log("Function Complete");
}

почему у вас будет такая функция, я не знаю, но то, что она выводит, показывает, как async await строительство. Сначала давайте рассмотрим, что происходит.

исполнение входит MyCallingFunction,Function Starting затем Save Starting записывается в консоль, то функция SaveChangesAsync() вызывается. На этом этапе выполнение возвращается к MyCallingFunction и входит в цикл for, записывая "продолжение выполнения" до 1000 раз. Когда SaveChangesAsync() финны, выполнение возвращается к

Это утверждение неверно:

на стороне сервера, когда мы используем асинхронные методы, нам также нужно добавить await.

вам не нужно добавлять "await". "await" - это просто удобное ключевое слово в C#, которое позволяет вам писать больше строк кода после вызова, и эти другие строки будут выполняться только после завершения операции сохранения. Но, как вы указали, вы можете сделать это просто вызвав SaveChanges вместо того, чтобы SaveChangesAsync.

но в принципе, асинхронный вызов - это гораздо больше. Идея здесь заключается в том, что если есть другая работа, которую вы можете сделать (на сервере) во время выполнения операции сохранения, то вы должны использовать SaveChangesAsync. Не используйте "ждут". Просто вызовите SaveChangesAsync, а затем продолжайте делать другие вещи параллельно. Это включает в себя потенциально, в веб-приложении, возвращая ответ клиенту еще до завершения сохранения. Но конечно, вы все равно захотите чтобы проверить конечный результат сохранения, чтобы в случае его сбоя вы могли сообщить об этом своему пользователю или каким-либо образом зарегистрировать его.

Comments

    Ничего не найдено.