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が完了します。
- データベースからすべての生徒を取得し、コンソールに書き込まれます。
理解を深めるために、上記の例を段階的に実行することをお勧めします。