實體框架 - 非同步查詢



非同步程式設計涉及在後臺執行操作,以便主執行緒可以繼續其自身的操作。這樣,主執行緒可以在後臺執行緒處理手頭任務的同時保持使用者介面響應。

  • 實體框架 6.0 支援用於查詢和儲存資料的非同步操作。

  • 非同步操作可以幫助您的應用程式以以下方式改進:

    • 使您的應用程式對使用者互動更具響應性
    • 提高應用程式的整體效能
  • 您可以透過多種方式執行非同步操作。但是,async/await 關鍵字是在 .NET Framework 4.5 中引入的,這使得您的工作變得簡單。

  • 您只需要遵循以下程式碼片段所示的 async/await 模式。

讓我們看一下以下示例(不使用 async/await),其中 DatabaseOperations 方法將新學生儲存到資料庫,然後從資料庫檢索所有學生,最後在控制檯上列印一些其他訊息。

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

執行上述程式碼時,您將收到以下輸出:

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

讓我們使用新的 async 和 await 關鍵字,並對 Program.cs 進行以下更改

  • 新增 System.Data.Entity 名稱空間,這將提供 EF 非同步擴充套件方法。

  • 新增 System.Threading.Tasks 名稱空間,這將允許我們使用 Task 型別。

  • 更新DatabaseOperations 以標記為async 並返回一個Task

  • 呼叫 SaveChanges 的非同步版本並等待其完成。

  • 呼叫 ToList 的非同步版本並等待結果。

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

執行後,它將產生以下輸出。

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

現在程式碼是非同步的,您可以觀察到程式的不同執行流程。

  • SaveChanges 開始將新學生推送到資料庫,然後 DatabaseOperations 方法返回(即使它尚未完成執行)並且 Main 方法中的程式流程繼續。

  • 然後訊息寫入控制檯。

  • 託管執行緒在 Wait 呼叫上被阻塞,直到資料庫操作完成。完成後,將執行我們 DatabaseOperations 的其餘部分。

  • SaveChanges 完成。

  • 從資料庫中檢索所有學生並寫入控制檯。

我們建議您逐步執行上述示例以更好地理解。

廣告

© . All rights reserved.