使用内收益回报

2024-01-11

如果我没记错的话,当我在里面使用yield时using SqlConnection阻止我遇到运行时异常。

using (var connection = new SqlConnection(connectionString))
{
    var command = new SqlCommand(queryString, connection);
    connection.Open();

    SqlDataReader reader = command.ExecuteReader();

    // Call Read before accessing data.
    while (reader.Read())
    {
        yield reader[0];
    }

    // Call Close when done reading.
    reader.Close();
}

当我更换后这些问题就解决了yield通过一个列表,我在每次迭代中添加了项目。

当我在里面时,同样的问题还没有发生在我身上using StreamReader blocks

using (var streamReader = new StreamReader(fileName))
{
    string line;
    while ((line = streamReader.ReadLine()) != null)
    {
        yield return line;
    }
}

有什么解释为什么异常发生在前一种情况而不是后者?这样的施工是否可取?

EDIT要获得我过去所做的错误(早期处理),您应该调用下面的第一个方法:

IEnumerable<string> Read(string fileName)
{
    using (var streamReader = new StreamReader(fileName))
    {
        return Read(streamReader);
    } // Dispose will be executed before ReadLine() because of deffered execution
}

IEnumerable<string> Read(StreamReader streamReader)
{
    string line;
    while ((line = streamReader.ReadLine()) != null)
    {
        yield return line;
    }
}

使用其他延迟执行的方法也可以实现相同的错误,例如System.Linq.Enumerable.Select()


See 这个帖子 https://stackoverflow.com/questions/1539114/yield-return-statement-inside-a-using-block-disposes-before-executing对于问题的一个很好的解释using and yield。因为您返回枚举器,所以 using 块在访问任何内容之前就已经销毁了上下文。答案有很好的解决方案,基本上,要么使包装器方法成为枚举器,要么构建一个列表。

而且通常更实用using周围的读者,而不是连接,并使用CommandBehavior.CloseConnection确保读者完成后资源得到释放。尽管在您的情况下并不重要,但如果您从方法返回数据读取器,这将确保在处理读取器时正确关闭连接。

   using(SqlDataReader reader = 
             command.ExecuteReader(CommandBehavior.CloseConnection)) {
        while (reader.Read())
        {
            yield reader[0];
        }
   }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用内收益回报 的相关文章

随机推荐

  • 为什么在 Selenium 中使用 add_experimental_option ?

    我试图理解与以下内容非常相似的代码片段 from selenium webdriver chrome options import Options chrome options Options port number 127 0 0 1 8
  • (Vue,ChartJS)从子组件画布上下文为图表创建渐变背景

    我想为我的图表提供渐变背景颜色 但我无法访问画布上下文 因为我的图表在我编写的包装器组件中呈现 What I want to achieve 我的实际包装看起来像这样
  • 使用 Java 解密由 .NET 的 RijndaelManaged 加密的字节

    我正在尝试解密一些东西 它是使用 NET C 的 RijndaelManaged 加密的 使用 Java 解密 C 程序不是我的 我无法将其更改为更具互操作性 但我知道它是如何加密的 byte bytes new UnicodeEncodi
  • 如何验证Java线程堆栈大小是否固定或有限?

    我试图验证 Java 堆栈大小是否固定 在开始时设置 或有限 增长到一定限制 我试图用一个简单的程序来测量这一点 该程序创建一定数量的线程 设置 Xss 但到目前为止我只发现 RSS 是每个进程的 并且出于明显的原因 知道堆大小在这里毫无意
  • Linq 完全外连接与数据表中的 NULL 记录 C#

    请问有人可以帮忙吗 我需要在 Extn In Call Records Extn Number 上返回一个表 如果任一侧不匹配 仍然返回一个计算 就像 SQL 完全外连接一样 我花了几个小时看这个 但无法让它工作 如果删除联合 我可以让代码
  • Monodroid - EditText 输入法不接受数字

    我在使用 Mono for Android 中的 EditText 控件时遇到一些非常奇怪的问题 我的解决方案针对的是 2 3 并且我正在 T Mobile VivaCity 上进行调试 这是我的 EditText 的 AXML
  • 如何阻止 git 在结账时破坏编码

    我最近使用以下设置将 gitattributes 文件添加到 c 存储库 text auto cs text diff csharp 我重新规范化了存储库按照 github 上的这些说明进行操作 https help github com
  • 更干净的元组 groupBy

    我有一系列键值对 String Int 我想按键将它们分组为值序列 即Seq String Int gt Map String Iterable Int 明显地 toMap在这里没有用 并且groupBy将值维护为元组 我想出的最好的办法是
  • Android Things:截图

    如何通过 ADB for Android Things 截屏 我努力了 adb shell screencap p sdcard screen png adb pull sdcard screen png adb shell rm sdca
  • Angular UI-Routing,页面刷新时自动重定向到父状态

    我正在开发一个使用 Angular UI 路由的项目 当我尝试刷新网页或直接输入 URL 时 它会被重定向到父状态 它确实加载了我重新加载的 URL 的状态 但随后快速重定向到父状态 这是我的状态路由 stateProvider state
  • 如何在 Objective C 中初始化一个空的可变数组

    我有一个对象 卡车 列表 其中包含填充表格视图的各种属性 当您点击它们时 它们会转到单独的卡车页面 有一个添加按钮 可以将它们添加到另一个表格视图中的收藏夹列表中 如何在 Cocoa 中初始化一个空的可变数组 我有以下代码 IBAction
  • bash脚本杀死超过一小时的php进程

    我有以下内容 kill 9 ps aux grep php awk 9 0 9 0 9 awk print 2 它的作用是杀死被 fcgid 放弃的进程并杀死它们以释放 RAM 我想每小时运行一次 cron 但想杀死早于一小时的进程 我只是
  • Textmate 到处检查拼写

    有什么方法可以检查我在 Textmate 中输入的所有单词的拼写吗 很难相信 但我实际上使用合法的英语单词来表示我的所有变量和类名 因此未突出显示的拼写错误简直要了我的命 如果有一种方法可以检查带有特殊字符的单词的拼写 那就太好了 uesr
  • 删除 PostgreSQL 中数字列的所有尾随零

    我有这张桌子properties其中有一个列atomic mass类型的NUMERIC 9 6 atomic mass 1 008000 4 002600 6 940000 9 012200 10 810000 12 011000 14 0
  • 如何访问类的静态成员?

    我正在尝试访问类的静态成员 我的班级是 class A public static strName A is my name public function xyz Since I have bunch of classes stored
  • 使用 perl 和 DBI 将非常大的表从一个 DB2 复制到另一个 DB2

    我每天需要将一个非常大 数百万行 的表从一个 DB2 数据库复制到另一个 DB2 数据库 并且我需要使用 perl 和 DBI 有没有比简单地从第一个数据库中获取每一行并将它们逐一插入到第二个数据库中更快的方法 这是我得到的 sth1 ud
  • 谷歌地图,没有启动导航的选项,只有预览

    在我的应用程序中 我在以下代码集的帮助下启动 Google 导航 String uri http maps google com maps saddr gpsLatitude gpsLongitude daddr updateAccepte
  • OSX Yosemite 升级后 adb(android 调试桥)出现问题

    我昨天将我的 2011 款 13 英寸 Macbook 升级到了 Yosemite 现在我在使用 adb 工具 1 0 31 1 0 32 时遇到问题 例如在设备上安装构建时 通过 ddms 复制文件 从eclipse android st
  • jsplumb 1.4.1 通过 uuid 或对象示例删除Endpoint

    我有一些 div 元素 每个元素有 2 个端点 一个在左侧 一个在右侧 现在我想删除每个右侧端点 每个端点都有自己唯一的 uuid 我得到了右侧端点的每个 uuid 的数组 gt 遍历它们并删除其中的每一个 但这不起作用 谁能给我一个通过
  • 使用内收益回报

    如果我没记错的话 当我在里面使用yield时using SqlConnection阻止我遇到运行时异常 using var connection new SqlConnection connectionString var command