c# - 在完成返回后关闭 IDataReader

标签 c# ienumerable yield-return

实际上不一定是 IDataReader .

我有一个类似这样的函数:

public IEnumerable<MyClass> GetObjects() 
{
  IDataReader dr = GetSomeDataReader();
  while (dr.Read())
  {
    yield return new MyClass(dr);
  }
  CloseDBConnections();
}

这工作得很好,直到我像这样重构它:

public IEnumerable<MyClass> GetObjects() 
{
  IDataReader dr = GetSomeDataReader();
  try
  {
    return ProcessReader(dr);
  } finally {
    CloseDBConnections();
  }
}
public IEnumerable<MyClass> ProcessReader(IDataReader dr)
{
  while (dr.Read())
  {
    yield return new MyClass(dr);
  }
}

这不起作用,因为当 CloseDBConnections()执行后枚举尚未处理。

调用.ToList()GetObjects 返回时是实际执行枚举的内容,但那时连接已经被破坏,IDataReader失败。

以我为例 CloseDBConnections无法从新的 ProcessReader 中调用功能因为 IDataReader可能来自其他来源(在这种情况下重构的全部意义)

是否有一个合理的解决方法,或者我必须复制枚举代码?

我尝试调用 ProcessReaderyield return而不是return但这不起作用,因为 C#(可以理解)认为我正在尝试添加 IEnumerableIEnumerable !

最佳答案

通过回调在 ProcessReader 中调用 CloseDBConnections 怎么样?

public IEnumerable<MyClass> GetObjects() 
{
  return ProcessReader(GetSomeDataReader(), CloseDBConnections);
}

public IEnumerable<MyClass> ProcessReader(IDataReader dr, Action OnFinished)
{
  try
  {
    while (dr.Read())
      yield return new MyClass(dr);
  }
  finally
  {
    if (OnFinished != null) 
      OnFinished();
  }
}

关于c# - 在完成返回后关闭 IDataReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17852918/

相关文章:

javascript - 从 Javascript 调用 aspx 代码隐藏中的函数会引发错误

c# - 即时通讯通知

c# - 任何人都可以帮我解决有关 C# 中的接口(interface)的问题

c# - 获取按名称分组的列表的所有组合

c# - 如何声明具有匿名类型的字段 (C#)

c# - foreach 循环中奇怪的 IEnumerable 行为

c# - 隐式类型;为什么只是局部变量?

c# - 如果两个 IEnumerable<T> 在 C# 中具有相同的项目,最短的比较方法是什么?

c# - 使用协程访问 Unity 中的 SQLite 数据库

c# - 在返回 void 的函数中使用 yield WaitForSeconds()