Entity Framework - Asynchroniczne zapytanie
Asynchronous programmingpolega na wykonywaniu operacji w tle, aby główny wątek mógł kontynuować swoje własne operacje. W ten sposób główny wątek może utrzymywać responsywność interfejsu użytkownika, podczas gdy wątek w tle przetwarza zadanie.
Entity Framework 6.0 obsługuje operacje asynchroniczne do wykonywania zapytań i zapisywania danych.
Operacje asynchroniczne mogą pomóc Twojej aplikacji w następujący sposób -
- Spraw, aby Twoja aplikacja była bardziej responsywna na interakcje użytkowników
- Popraw ogólną wydajność swojej aplikacji
Operacje asynchroniczne można wykonywać na różne sposoby. Jednak słowa kluczowe async / await zostały wprowadzone w .NET Framework 4.5, co upraszcza pracę.
Jedyną rzeczą, którą musisz przestrzegać, jest wzorzec async / await, jak ilustruje poniższy fragment kodu.
Przyjrzyjmy się poniższemu przykładowi (bez użycia async / await), w którym metoda DatabaseOperations zapisuje nowego ucznia do bazy danych, a następnie pobiera wszystkich studentów z bazy, a na koniec na konsoli wypisywany jest dodatkowy komunikat.
class Program {
static void Main(string[] args) {
Console.WriteLine("Database Operations Started");
DatabaseOperations();
Console.WriteLine();
Console.WriteLine("Database Operations Completed");
Console.WriteLine();
Console.WriteLine("Entity Framework Tutorials");
Console.ReadKey();
}
public static void DatabaseOperations() {
using (var context = new UniContextEntities()) {
// Create a new student and save it
context.Students.Add(new Student {
FirstMidName = "Akram",
LastName = "Khan",
EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())});
Console.WriteLine("Calling SaveChanges.");
context.SaveChanges();
Console.WriteLine("SaveChanges completed.");
// Query for all Students ordered by first name
var students = (from s in context.Students
orderby s.FirstMidName select s).ToList();
// Write all students out to Console
Console.WriteLine();
Console.WriteLine("All Student:");
foreach (var student in students) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine(" " + name);
}
}
}
}
Po wykonaniu powyższego kodu otrzymasz następujący wynik -
Calling SaveChanges.
SaveChanges completed.
All Student:
Akram Khan
Ali Khan
Ali Alexander
Arturo Anand
Bill Gates
Gytis Barzdukas
Laura Nornan
Meredith fllonso
Nino Olioetto
Peggy Justice
Yan Li
Entity Framework Tutorials
Użyjmy nowych słów kluczowych async i await i wprowadźmy następujące zmiany w Program.cs
Dodaj przestrzeń nazw System.Data.Entity, która zapewni EF asynchroniczne metody rozszerzenia.
Dodaj przestrzeń nazw System.Threading.Tasks, która pozwoli nam użyć typu Task.
Aktualizacja DatabaseOperations być oznaczone jako async i zwróć plik Task.
Wywołaj wersję Async SaveChanges i poczekaj na jej zakończenie.
Wywołaj wersję Async narzędzia ToList i poczekaj na wynik.
class Program {
static void Main(string[] args) {
var task = DatabaseOperations();
Console.WriteLine();
Console.WriteLine("Entity Framework Tutorials");
task.Wait();
Console.ReadKey();
}
public static async Task DatabaseOperations() {
using (var context = new UniContextEntities()) {
// Create a new blog and save it
context.Students.Add(new Student {
FirstMidName = "Salman",
LastName = "Khan",
EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())});
Console.WriteLine("Calling SaveChanges.");
await context.SaveChangesAsync();
Console.WriteLine("SaveChanges completed.");
// Query for all Students ordered by first name
var students = await (from s in context.Students
orderby s.FirstMidName select s).ToListAsync();
// Write all students out to Console
Console.WriteLine();
Console.WriteLine("All Student:");
foreach (var student in students) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine(" " + name);
}
}
}
}
Po wykonaniu wygeneruje następujący wynik.
Calling SaveChanges.
Entity Framework Tutorials
SaveChanges completed.
All Student:
Akram Khan
Ali Khan
Ali Alexander
Arturo Anand
Bill Gates
Gytis Barzdukas
Laura Nornan
Meredith fllonso
Nino Olioetto
Peggy Justice
Salman Khan
Yan Li
Teraz, gdy kod jest asynchroniczny, możesz obserwować inny przepływ wykonywania programu.
SaveChanges zaczyna wypychać nowego ucznia do bazy danych, a następnie metoda DatabaseOperations zwraca (nawet jeśli nie została zakończona), a przepływ programu w metodzie Main jest kontynuowany.
Wiadomość jest następnie zapisywana na konsoli.
Zarządzany wątek jest blokowany w wywołaniu Wait do zakończenia operacji bazy danych. Po zakończeniu pozostała część naszych operacji bazy danych zostanie wykonana.
SaveChanges zakończyło się.
Pobrano wszystkich uczniów z bazy danych i zapisano w konsoli.
Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.