實際上它不一定是IDataReader
。收益回報完成後關閉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()
執行枚舉這不起作用尚未處理。
從GetObjects
返回時調用.ToList()
是實際執行枚舉的內容,但此時連接已被破壞,並且IDataReader
失敗。
在我的實例CloseDBConnections
不能從新ProcessReader
函數中調用,因爲IDataReader
可能來自其他來源(再保在這種情況下,整點)
是否有一個合理的辦法解決這個或者我將不得不復制枚舉代碼?
我試圖把調用ProcessReader
爲yield return
,而不是return
但這並不工作,因爲C#(可以理解)認爲我想添加一個IEnumerable
到IEnumerable
!
你應該在'finally'中執行回調。否則,如果迭代提前完成(例如'GetObjects()。First()'),它將不會被執行。 – svick
@svick好點。 – sloth
@DominicKexel我喜歡它。 這就是我最終在Javascript中做了很多事情 – DJL