2016-12-02 188 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,异步/等待帮助如何? –