实际上不一定是 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
可能来自其他来源(在这种情况下重构的全部意义)
是否有一个合理的解决方法,或者我必须复制枚举代码?
我尝试调用 ProcessReader
如yield return
而不是return
但这不起作用,因为 C#(可以理解)认为我正在尝试添加 IEnumerable
到IEnumerable
!
最佳答案
通过回调在 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/