- 實體框架教程
- 實體框架 - 首頁
- 實體框架 - 概述
- 實體框架 - 架構
- 實體框架 - 環境設定
- 實體框架 - 資料庫設定
- 實體框架 - 資料模型
- 實體框架 - DbContext
- 實體框架 - 型別
- 實體框架 - 關係
- 實體框架 - 生命週期
- 實體框架 - 程式碼優先方法
- 實體框架 - 模型優先方法
- 實體框架 - 資料庫優先方法
- 實體框架 - 開發方法
- 實體框架 - 資料庫操作
- 實體框架 - 併發
- 實體框架 - 事務
- 實體框架 - 檢視
- 實體框架 - 索引
- 實體框架 - 儲存過程
- 實體框架 - 斷開連線的實體
- 實體框架 - 表值函式
- 實體框架 - 本機SQL
- 實體框架 - 列舉支援
- 實體框架 - 非同步查詢
- 實體框架 - 持久化
- 實體框架 - 投影查詢
- 實體框架 - 命令日誌
- 實體框架 - 命令攔截
- 實體框架 - 空間資料型別
- 實體框架 - 繼承
- 實體框架 - 遷移
- 實體框架 - 渴望載入
- 實體框架 - 延遲載入
- 實體框架 - 顯式載入
- 實體框架 - 驗證
- 實體框架 - 跟蹤更改
- 實體框架 - 彩色實體
- 實體框架 - 程式碼優先方法
- 實體框架 - 第一個示例
- 實體框架 - 資料註釋
- 實體框架 - Fluent API
- 實體框架 - 種子資料庫
- 實體框架 - 程式碼優先遷移
- 實體框架 - 多個DbContext
- 實體框架 - 巢狀實體型別
- 實體框架資源
- 實體框架 - 快速指南
- 實體框架 - 有用資源
- 實體框架 - 討論
實體框架 - 非同步查詢
非同步程式設計涉及在後臺執行操作,以便主執行緒可以繼續其自身的操作。這樣,主執行緒可以在後臺執行緒處理手頭任務的同時保持使用者介面響應。
實體框架 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 完成。
從資料庫中檢索所有學生並寫入控制檯。
我們建議您逐步執行上述示例以更好地理解。