Основы сущность метода SaveChanges() и SaveChangesAsync() и найти() и FindAsync()
Я искал различия между двумя парами выше, но не нашел никаких статей, объясняющих четко об этом, а также Когда использовать тот или иной.
так в чем разница между SaveChanges() и SaveChangesAsync()?
И между Find() и FindAsync()?
на стороне сервера, когда мы используем Async методы, нам также нужно добавить await. Таким образом, я не думаю, что это асинхронно на стороне сервера.
это только помогает предотвратить пользовательский интерфейс блокировка на стороне клиента браузера? Или есть какие-то плюсы и минусы между ними?
2 ответов:
каждый раз, когда вам нужно выполнить действие на удаленном сервере, ваша программа генерирует запрос, отправляет его, а затем ждет ответа. Я буду использовать
SaveChanges()иSaveChangesAsync()в качестве примера, но то же самое относится кFind()иFindAsync().скажем, у вас есть список
myListиз 100 + элементов, которые необходимо добавить в базу данных. Чтобы вставить это, ваша функция будет выглядеть примерно так:using(var context = new MyEDM()) { context.MyTable.AddRange(myList); context.SaveChanges(); }сначала вы создаете и экземпляр
MyEDMдобавить списокmyListto в таблице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