2016-12-02 156 views
2

可以解釋一下SaveChangesSaveChangesAsync之間的主要區別是什麼?我應該在哪裏使用SaveChangesAsync以及何時? 性能如何變化?SaveChanges vs實體框架中的SaveChangesAsync

我這裏有兩個例子:

Asyncronous功能:

private static async void AddStudent() 
{ 
    Student myStudent = new Student(); 
    using (var context = new SchoolDBEntities()) 
    {   
     context.Students.Add(myStudent); 
     await context.SaveChangesAsync();   
    } 
} 

Syncronous功能:

private static void AddStudent() 
{ 
    Student myStudent = new Student(); 
    using (var context = new SchoolDBEntities()) 
    {   
     context.Students.Add(myStudent); 
     context.SaveChanges();   
    } 
} 

在此先感謝!

回答

6

你的異步例子應該是這樣的:

private static async Task AddStudent() 
{ 
    Student myStudent = new Student(); 
    using (var context = new SchoolDBEntities()) 
    {   
     context.Students.Add(myStudent); 
     await context.SaveChangesAsync();   
    } 
} 

同步和異步調用之間的區別是,後者不會阻塞調用線程。數據庫操作受到I/O限制:網絡速度不快,SQL查詢需要時間來處理。因此,我們可以不等待結果(阻塞線程),而是將該線程返回到線程池,以便可以處理併發用戶請求。當您的網站被多個用戶同時擊中時,這對縮放至關重要。但是,爲了利用async/await功能,您的整個呼叫鏈必須在堆棧上異步。

我建議閱讀async/await的一些基本介紹,如this

+0

I/O綁定操作執行大量I/O調用,如文件,套接字,netpipe讀取和寫入。這些操作被認爲是緩慢的,並不需要幾乎任何CPU能力(它們自然是基於事件的)。相反,CPU綁定操作,即像圖像處理,內存中收集聚合等那樣進行大量計算的操作。 – UserControl

+0

再次感謝,@UserControl –

+0

我在savechanges期間有100%cpu加載。如果需要在內存髒檢查中執行大量的cpu,異步/等待幫助如何? –