Khung thực thể - Truy vấn không đồng bộ

Asynchronous programmingliên quan đến việc thực thi các hoạt động trong nền để luồng chính có thể tiếp tục các hoạt động của chính nó. Bằng cách này, luồng chính có thể giữ cho giao diện người dùng phản hồi trong khi luồng nền đang xử lý tác vụ trong tầm tay.

  • Entity Framework 6.0 hỗ trợ các hoạt động không đồng bộ để truy vấn và lưu dữ liệu.

  • Các hoạt động không đồng bộ có thể giúp ứng dụng của bạn theo những cách sau:

    • Làm cho ứng dụng của bạn phản hồi nhanh hơn với các tương tác của người dùng
    • Cải thiện hiệu suất tổng thể của ứng dụng của bạn
  • Bạn có thể thực hiện các hoạt động không đồng bộ theo nhiều cách khác nhau. Nhưng các từ khóa async / await đã được giới thiệu trong .NET Framework 4.5 giúp công việc của bạn trở nên đơn giản.

  • Điều duy nhất bạn cần làm theo là mẫu async / await như được minh họa bằng đoạn mã sau.

Hãy xem ví dụ sau (không sử dụng async / await) trong đó phương thức DatabaseOperations lưu một học sinh mới vào cơ sở dữ liệu và sau đó truy xuất tất cả học sinh từ cơ sở dữ liệu và cuối cùng một số thông báo bổ sung được in trên bảng điều khiển.

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);
         }
      }
   }
}

Khi đoạn mã trên được thực thi, bạn sẽ nhận được kết quả sau:

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

Hãy sử dụng từ khóa async và await mới và thực hiện các thay đổi sau đối với Program.cs

  • Thêm không gian tên System.Data.Entity sẽ cung cấp các phương thức mở rộng không đồng bộ EF.

  • Thêm không gian tên System.Threading.Tasks sẽ cho phép chúng tôi sử dụng loại Tác vụ.

  • Cập nhật DatabaseOperations được đánh dấu là async và trả lại một Task.

  • Gọi phiên bản Không đồng bộ của SaveChanges và chờ hoàn thành.

  • Gọi phiên bản Async của ToList và chờ đợi kết quả.

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);
         }
      }
   }
}

Khi thực thi, nó sẽ tạo ra kết quả sau.

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

Bây giờ mã không đồng bộ, bạn có thể quan sát một luồng thực thi khác của chương trình.

  • SaveChanges bắt đầu đẩy Sinh viên mới vào cơ sở dữ liệu và sau đó phương thức DatabaseOperations trả về (ngay cả khi nó chưa thực thi xong) và luồng chương trình trong phương thức Chính tiếp tục.

  • Sau đó tin nhắn được ghi vào bảng điều khiển.

  • Luồng được quản lý bị chặn trên cuộc gọi Chờ cho đến khi hoạt động cơ sở dữ liệu hoàn tất. Khi nó hoàn tất, phần còn lại của DatabaseOperations của chúng tôi sẽ được thực thi.

  • SaveChanges hoàn tất.

  • Lấy tất cả học sinh từ cơ sở dữ liệu và được ghi vào Bảng điều khiển.

Chúng tôi khuyên bạn nên thực hiện ví dụ trên theo cách từng bước để hiểu rõ hơn.