這個(gè)特性從EF6開(kāi)始,在之前的版本中不存在.
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、連山網(wǎng)站維護(hù)、網(wǎng)站推廣。
EF6(.net 4.5)開(kāi)始支持用async和await關(guān)鍵字進(jìn)行異步查詢和保存,不是所有的程序都能從異步中得到好處,當(dāng)被掛起長(zhǎng)時(shí)間的運(yùn)行,網(wǎng)絡(luò)或IO-bound任務(wù),可以被用于提高客戶端的響應(yīng)和服務(wù)端的擴(kuò)展,
什么時(shí)侯適合使用asyn
創(chuàng)建model
創(chuàng)建異步程序
讓程序異步
結(jié)論
什么時(shí)侯適合使用asyn
這篇文章的目的是用一種方式介紹asyn概念,讓它很容易被觀察到異步和同步程序之間的區(qū)別,這個(gè)演練不關(guān)注異步編程帶來(lái)好處的任何場(chǎng)景。
異步操作通常用于執(zhí)行完成時(shí)間可能較長(zhǎng)的任務(wù),如打開(kāi)大文件、連接遠(yuǎn)程計(jì)算機(jī)或查詢數(shù)據(jù)庫(kù)。異步操作在主應(yīng)用程序線程以外的線程中執(zhí)行。應(yīng)用程序調(diào)用方法異步執(zhí)行某個(gè)操作時(shí),應(yīng)用程序可在異步方法執(zhí)行其任務(wù)時(shí)繼續(xù)執(zhí)行。
在客戶端程序(WinForm, WPF等)中,在當(dāng)前的線程執(zhí)行時(shí)異步操作可用于保持UI的響應(yīng)。在服務(wù)端程序中(ASP.NET等)異步線程可以被用于處理其它未來(lái)的請(qǐng)求 - 這是可以減少內(nèi)存的使用量或增加服務(wù)器的吞吐量。
在多數(shù)的程序中使用異步?jīng)]有明顯的好處,甚至是有害的。使用測(cè)試,分析和通用場(chǎng)景來(lái)測(cè)量在你的特定的情況下的影響。
Create the model
創(chuàng)建控制臺(tái)程序AsyncDemo
添加EntityFramework Nuget package
安裝EntityFramework package
創(chuàng)建Model - AsyncDemo.cs:
using System.Collections.Generic; using System.Data.Entity; namespace AsyncDemo { public class BloggingContext : DbContext { public DbSetBlogs { get; set; } public DbSet Posts { get; set; } } public class Blog { public int BlogId { get; set; } public string Name { get; set; } public virtual List Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public virtual Blog Blog { get; set; } } }
創(chuàng)建一個(gè)異步程序
class Program { static void Main(string[] args) { PerformDatabaseOperations(); Console.WriteLine(); Console.WriteLine("Quote of the day"); Console.WriteLine("Don't worry about the world coming to an end today... "); Console.WriteLine("It's already tomorrow in Australia."); Console.WriteLine(); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } public static void PerformDatabaseOperations() { using (var db = new BloggingContext()) { // Create a new blog and save it db.Blogs.Add(new Blog { Name = "Test Blog #" + (db.Blogs.Count() + 1) }); db.SaveChanges(); // Query for all blogs ordered by name var blogs = (from b in db.Blogs orderby b.Name select b).ToList(); // Write all blogs out to Console Console.WriteLine(); Console.WriteLine("All blogs:"); foreach (var blog in blogs) { Console.WriteLine(" " + blog.Name); } } } }
PerformDatabaseOperations方法會(huì)保存一個(gè)新的Blog到數(shù)據(jù)庫(kù)并且獲取所有的Blogs然后打印在控制臺(tái)中。
修改為異步
//添加Tasks引用 using System.Data.Entity; using System.Threading.Tasks; static void Main(string[] args) { var task = PerformDatabaseOperations(); Console.WriteLine("Quote of the day"); Console.WriteLine(" Don't worry about the world coming to an end today... "); Console.WriteLine(" It's already tomorrow in Australia."); task.Wait(); Console.WriteLine(); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } public static async Task PerformDatabaseOperations() { using (var db = new BloggingContext()) { // Create a new blog and save it db.Blogs.Add(new Blog { Name = "Test Blog #" + (db.Blogs.Count() + 1) }); Console.WriteLine("Calling SaveChanges."); await db.SaveChangesAsync(); Console.WriteLine("SaveChanges completed."); // Query for all blogs ordered by name Console.WriteLine("Executing query."); var blogs = await (from b in db.Blogs orderby b.Name select b).ToListAsync(); // Write all blogs out to Console Console.WriteLine("Query completed with following results:"); foreach (var blog in blogs) { Console.WriteLine(" - " + blog.Name); } } }
原文:https://msdn.microsoft.com/en-us/data/jj819165.aspx