在返回IEnumerable<>
的方法中,我打開並遍歷資源(例如數據庫行讀取器)。循環完成後,資源再次關閉。如何取消IEnumerable?
但是,可能發生呼叫者決定不完成枚舉。這會使資源打開。
例子:
IEnumerable<Foo> Bar()
{
using (var r = OpenResource()) {
while (r.Read()) {
yield return r;
}
}
}
// OK - this closes the resource again
foreach (var foo in Bar()) {
Console.WriteLine (foo);
}
// Not OK - resource stays open!
Console.WriteLine (Bar().First());
我將如何解決這個問題?我是否可以輕鬆取消枚舉,即告訴它跳過循環的其餘部分,還是將其丟棄(將清理代碼放在Dispose
中)?
我認爲要返回Func<Result, bool>
,這樣用戶可以讓它返回false
,如果他完成了迭代。同樣,也可以使用某種取消令牌。但這兩種方法對我來說似乎都很麻煩。
我搜索了一下,發現沒有類似的問題,但我確定應該有一個 - 這是一個非常基本的問題。 – mafu
'break;'應該取消它,生成的代碼應該處理枚舉器。如果來源不正確,那麼需要修正。 –
@ DanielA.White我想取消它在調用範圍內,而不是枚舉方法本身 – mafu