实体框架 SaveChanges() 与 SaveChangesAsync() 和 Find() 与 FindAsync()

2024-01-07

我一直在寻找上述两对之间的差异,但没有找到任何文章清楚地解释它以及何时使用其中之一。

那么有什么区别SaveChanges() and SaveChangesAsync()?
而之间Find() and FindAsync()?

在服务器端,当我们使用Async方法,我们还需要添加await。因此,我不认为它在服务器端是异步的。

它是否仅有助于防止客户端浏览器上的 UI 阻塞?或者说它们之间有什么优缺点吗?


每当您需要在远程服务器上执行操作时,您的程序都会生成请求、发送请求,然后等待响应。我会用SaveChanges() and SaveChangesAsync()作为一个例子,但这同样适用于Find() and FindAsync().

假设你有一个清单myList您需要添加到数据库的 100 多个项目。要插入它,您的函数将如下所示:

using(var context = new MyEDM())
{
    context.MyTable.AddRange(myList);
    context.SaveChanges();
}

首先你创建一个实例MyEDM, 添加列表myList到餐桌上MyTable,然后调用SaveChanges()将更改保存到数据库。它按照您想要的方式工作,记录被提交,但您的程序在提交完成之前无法执行任何其他操作。这可能需要很长时间,具体取决于您要提交的内容。如果您要提交对记录的更改,实体必须一次提交这些更改(我曾经有一次保存更新需要 2 分钟)!

要解决此问题,您可以执行以下两种操作之一。第一个是您可以启动一个新线程来处理插入。虽然这将释放调用线程以继续执行,但您创建了一个新线程,它将坐在那里等待。不需要那种开销,这就是async await模式解决。

对于 I/O 操作,await很快就成为你最好的朋友。根据上面的代码部分,我们可以将其修改为:

using(var context = new MyEDM())
{
    Console.WriteLine("Save Starting");
    context.MyTable.AddRange(myList);
    await context.SaveChangesAsync();
    Console.WriteLine("Save Complete");
}

这是一个非常小的更改,但会对代码的效率和性能产生深远的影响。那么会发生什么呢?代码的开头是相同的,您创建一个实例MyEDM并添加你的myList to MyTable。但当你打电话时await context.SaveChangesAsync(),代码的执行返回调用函数!因此,当您等待所有这些记录提交时,您的代码可以继续执行。假设包含上述代码的函数的签名为public async Task SaveRecords(List<MyTable> saveList),调用函数可能如下所示:

public async Task MyCallingFunction()
{
    Console.WriteLine("Function Starting");
    Task saveTask = SaveRecords(GenerateNewRecords());

    for(int i = 0; i < 1000; i++){
        Console.WriteLine("Continuing to execute!");
    }

    await saveTask;
    Console.Log("Function Complete");
}

我不知道为什么你会有这样的函数,但它的输出显示了如何async await作品。首先让我们回顾一下发生了什么。

执行进入MyCallingFunction, Function Starting then Save Starting被写入控制台,然后函数SaveChangesAsync()被叫。此时,执行返回到MyCallingFunction并进入 for 循环,写入“继续执行”最多 1000 次。什么时候SaveChangesAsync()完成,执行返回到SaveRecords功能、写作Save Complete到控制台。一旦一切都进入SaveRecords完成,执行将继续MyCallingFunction是的,当时是SaveChangesAsync()完成的。使困惑?这是一个示例输出:



Function Starting
Save Starting
Continuing to execute!
Continuing to execute!
Continuing to execute!
Continuing to execute!
Continuing to execute!
....
Continuing to execute!
Save Complete!
Continuing to execute!
Continuing to execute!
Continuing to execute!
....
Continuing to execute!
Function Complete!
  

或者可能:



Function Starting
Save Starting
Continuing to execute!
Continuing to execute!
Save Complete!
Continuing to execute!
Continuing to execute!
Continuing to execute!
....
Continuing to execute!
Function Complete!
  

这就是它的美丽之处async await,当您等待某些事情完成时,您的代码可以继续运行。实际上,您将有一个更像这样的函数作为您的调用函数:

public async Task MyCallingFunction()
{
    List<Task> myTasks = new List<Task>();
    myTasks.Add(SaveRecords(GenerateNewRecords()));
    myTasks.Add(SaveRecords2(GenerateNewRecords2()));
    myTasks.Add(SaveRecords3(GenerateNewRecords3()));
    myTasks.Add(SaveRecords4(GenerateNewRecords4()));

    await Task.WhenAll(myTasks.ToArray());
}

在这里,您有四种不同的保存记录功能同时. MyCallingFunction使用会更快地完成async await比如果个人SaveRecords函数被串联调用。

我还没有触及的一件事是await关键词。它的作用是停止当前函数的执行,直到发生任何事情Task您正在等待完成。所以在原来的情况下MyCallingFunction, 线Function Complete不会被写入控制台,直到SaveRecords函数结束。

长话短说,如果您可以选择使用async await,您应该这样做,因为它将大大提高应用程序的性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 SaveChanges() 与 SaveChangesAsync() 和 Find() 与 FindAsync() 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • IE框架边框替代

    对于这行代码 我收到此错误 validator w3 org XHTML 1 0 Transitional there is no attribute frameBorder 我在用着frameBorder因为 IE8 在 iframe 上
  • 有人使用 Android NDK 构建过 ZBar 吗?

    我正在尝试将 ZBar 集成到我的 Android 应用程序中 但无法构建本机库 我想知道是否有人以前做过并愿意与我分享 我知道这个问题很老了 但是 ZBar 提供了 android SDK http sourceforge net pro
  • 可以使用单个正则表达式来解析函数参数吗?

    Problem 有一个程序文件 在文件中的某个位置包含以下代码片段 food apples oranges pears tomato 该函数可以包含任意数量的参数 但它们必须是用逗号分隔的字符串 所有参数字符串都是小写单词 我希望能够使用正
  • 我应该如何记录继承的成员? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 考虑一下我有一个复杂的类结构 其中许多元素继承自其他元素 我可能有一个方法GetStuff string stuffName int count
  • 以编程方式检索 iPhone 上的内存使用情况

    我正在尝试以编程方式随时检索我的 iPhone 应用程序正在使用的内存量 是的 我知道 ObjectAlloc Leaks 我对这些不感兴趣 只是想知道是否可以编写一些代码并获取正在使用的字节数并通过 NSLog 报告它 Thanks 要获
  • 在 Swift 4 中调整 UISwitch 的大小

    我想更改 Swift 4 中 UISwitch 的默认大小 我查看了各种选项 但它们都与 v3 相关并且不起作用 请问有人可以建议一个在 Swift 4 中以编程方式执行此操作的示例吗 谢谢你 Edit 我尝试过以下示例 switchTes
  • 如何登录 SailsJS

    登录 SailsJS 的实际语法是什么 文档没有任何内容 但在网站的路线图中找到了以下行 将 Sails log winston 包装器 作为一个单独的模块拉出来 这样它就可以 由水线使用 我想象它是这样的 Sails log Sails
  • 三行模态,固定标题、底行和可滚动的中间行

    我正在尝试创建一个具有顶部 中间和底部的模态 顶部始终是固定高度 底部必须 粘 在底部上 并且可能会有所不同 其中的所有内容和元素都必须从底部构建 因此 如果有一行文本 底部将是该行的高度 如果有 3 或 4 行文本 底部会根据需要向上推
  • 如何在PHP中使用其原始参数调用父类构造函数

    我有这个代码 class A var arr array function construct para echo Not called class B extends A function construct arr new Item 由
  • LOCK_NB 被忽略

    运行此代码两次 fp fopen test test wb if flock fp LOCK NB LOCK EX fwrite fp data echo written sleep 5 else echo skipped ok flock
  • 如何使用 YouTube IFrame Player API 监听时间更改事件?

    我在 YouTube IFrame Player API 文档上找不到任何方法来监听时间变化 因此我可以在 UI 中显示视频的当前时间 持续时间 有没有办法在不轮询的情况下做到这一点getCurrentTime YouTube IFrame
  • Netty Channel.write 线程安全吗?

    我有一个 Netty 应用程序 我希望有多个线程写入通道 我只是想知道 Channel write 是否线程安全 从代码中可以看出 ChannelOutboundBuffer addMessage 方法本身不是线程安全的 然而 写入通道是
  • 如何在 Asyncio 中列出文件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望能够在不阻塞的情况下获取文件列表 但我没有在文档 https docs python org 3 library asyncio
  • Kafka消费者配置/性能问题

    我正在尝试使用 kafka 作为 AWS SQS 的替代品 其动机主要是为了提高性能 其中 kafka 将消除一次拉取 10 条消息且上限为 256kb 的限制 这是我的用例的高级场景 我有一堆爬虫正在发送文档以进行索引 有效负载的大小平均
  • 单元测试构造函数时使用多个断言?

    我正在尝试使用 2 个构造函数对一个类进行单元测试 每个构造函数都有多个设置公共属性的参数 我的问题是 我是否应该只有 2 个具有多个断言的单元测试来检查每个属性是否已设置 或者是否对每个构造函数的每个参数进行测试 Public Perso
  • 有没有办法在CSS中创建canvas元素的3D圆柱体?

    我想将画布呈现为一个圆锥体 你可以像轮子一样双向旋转 这对于 JS CSS3 来说是可能的吗 您应该看看这个新的 CSS3 功能 自定义滤镜 CSS 着色器 这里有一些非常好的演示 比我能更好地描述整个事情 如何在 Chrome 上启用它
  • 具有多个参数的函数方差

    在我们的代码中尝试过类似的操作 但失败了 Func
  • 如何从启用了“以管理员身份运行”的基于 WiX 的安装程序安装桌面快捷方式(到批处理文件)?

    我正在从基于 WiX 的安装程序安装桌面快捷方式 到批处理文件 如何在启用 以管理员身份运行 设置的情况下自动配置此快捷方式 目标操作系统是Windows Server 2008 R2 并且安装程序正在以提升的权限运行 Update 感谢
  • Porter Stemmer 算法未返回预期输出?当修改为def时

    我正在使用PorterStemmer http tartarus org martin PorterStemmer Python 端口 http tartarus org martin PorterStemmer python txt 波特
  • 实体框架 SaveChanges() 与 SaveChangesAsync() 和 Find() 与 FindAsync()

    我一直在寻找上述两对之间的差异 但没有找到任何文章清楚地解释它以及何时使用其中之一 那么有什么区别SaveChanges and SaveChangesAsync 而之间Find and FindAsync 在服务器端 当我们使用Async