エンティティフレームワーク-非同期クエリ

Asynchronous programmingメインスレッドが独自の操作を続行できるように、バックグラウンドで操作を実行する必要があります。このようにして、メインスレッドは、バックグラウンドスレッドが手元のタスクを処理している間、ユーザーインターフェイスの応答性を維持できます。

  • Entity Framework 6.0は、データのクエリと保存のための非同期操作をサポートしています。

  • 非同期操作は、次の方法でアプリケーションを支援できます-

    • アプリケーションをユーザーの操作に対する応答性を高める
    • アプリケーションの全体的なパフォーマンスを向上させる
  • 非同期操作はさまざまな方法で実行できます。しかし、async / awaitキーワードは、作業を簡単にする.NET Framework4.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に次の変更を加えましょう。

  • EF非同期拡張メソッドを提供するSystem.Data.Entity名前空間を追加します。

  • System.Threading.Tasks名前空間を追加して、タスクタイプを使用できるようにします。

  • 更新 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は新しいStudentをデータベースにプッシュし始め、その後DatabaseOperationsメソッドが戻り(実行が終了していなくても)、Mainメソッドのプログラムフローが続行されます。

  • その後、メッセージがコンソールに書き込まれます。

  • 管理対象スレッドは、データベース操作が完了するまで待機呼び出しでブロックされます。完了すると、残りのDatabaseOperationsが実行されます。

  • SaveChangesが完了します。

  • データベースからすべての学生を取得し、コンソールに書き込みます。

理解を深めるために、上記の例を段階的に実行することをお勧めします。