gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:10:05 24 4
gpt4 key购买 nike

实际上不一定是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com