エンティティフレームワーク-非同期クエリ
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が完了します。
データベースからすべての学生を取得し、コンソールに書き込みます。
理解を深めるために、上記の例を段階的に実行することをお勧めします。