Entity-framework-asynchronous-query

提供:Dev Guides
移動先:案内検索

Entity Framework-非同期クエリ

  • 非同期プログラミング*では、メインスレッドが独自の操作を継続できるように、バックグラウンドで操作を実行します。 このようにして、バックグラウンドスレッドがタスクを処理している間、メインスレッドはユーザーインターフェイスの応答性を維持できます。
  • Entity Framework 6.0は、データのクエリと保存のための非同期操作をサポートしています。
  • 非同期操作は、次の方法でアプリケーションを支援することができます-
  • ユーザーの操作に対するアプリケーションの応答性を高める
  • アプリケーションの全体的なパフォーマンスを改善する
  • 非同期操作はさまざまな方法で実行できます。 ただし、async/awaitキーワードは.NET Framework 4.5で導入されたため、作業が簡単になります。
  • 従う必要があるのは、次のコードフラグメントに示すように、async/awaitパターンのみです。

DatabaseOperationsメソッドが新しい学生をデータベースに保存し、データベースからすべての学生を取得し、最後に追加のメッセージがコンソールに出力される次の例を見てみましょう(async/awaitを使用しない)。

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名前空間を追加して、Taskタイプを使用できるようにします。
  • async としてマークされるように DatabaseOperations を更新し、 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が完了します。
  • データベースからすべての生徒を取得し、コンソールに書き込まれます。

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