c# - Entity Framework 中的 SaveChanges 与 SaveChangesAsync

标签 c# asynchronous async-await

可以解释一下 SaveChangesSaveChangesAsync 之间的主要区别是什么吗?我应该在哪里使用 SaveChangesAsync 以及何时使用? 性能如何变化?

我这里有两个例子:

异步函数:

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

同步函数:

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

提前致谢!

最佳答案

您的异步示例应该是这样的:

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 .

关于c# - Entity Framework 中的 SaveChanges 与 SaveChangesAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40931432/

相关文章:

c# - 识别对互操作库(Doument.Paragraphs 等)中对象的唯一引用

c# - 在 GET 中将日期时间参数传递给 Web 服务时遇到问题

jquery - jQuery的empty()和remove()函数是否异步执行?

c# - .netstandard 库和 UniversalApiContract

c# - 未实现/支持/无效操作异步方法

c# - VS 2012 发布后,使用异步与 VS 2010 的正确方法?

c# - 在不影响客户端的情况下更改 WCF 项目的命名空间

c# - .Net Async ContinueWith VS 在任务中嵌入任务

c# - LINQ 使所有方法异步

c# - 与 Web 服务共享 Web 应用程序 session