我有以下方法:
public static IEnumerable<Dictionary<string, object>> GetRowsIter
(this SqlCeResultSet resultSet)
{
// Make sure we don't multi thread the database.
lock (Database)
{
if (resultSet.HasRows)
{
resultSet.Read();
do
{
var resultList = new Dictionary<string, object>();
for (int i = 0; i < resultSet.FieldCount; i++)
{
var value = resultSet.GetValue(i);
resultList.Add(resultSet.GetName(i), value == DBNull.Value
? null : value);
}
yield return resultList;
} while (resultSet.Read());
}
yield break;
}
Run Code Online (Sandbox Code Playgroud)
我刚刚添加了lock(Database)试图摆脱一些经济问题.我很好奇,是否会yield return释放锁定Database,然后在下一次迭代时重新锁定?或者Database在整个迭代期间保持锁定状态?
Jar*_*Par 20
否yield return不会造成任何锁被释放/解锁.该lock语句将扩展为一个try / finally块,并且迭代器不会try / finally以与iterator方法中的显式不同的方式对待它.
细节有点复杂,但是finally块在迭代器方法中运行的基本规则是
Dispose调用finally时,挂起点的范围内的块将运行finally该finally块运行. yield break语句时finally,范围内的块yield break将运行Mar*_*ell 13
锁转换为try/finally(正常c#)
在Iterator块(又名yield)中,"finally"成为枚举器的IDisposable.Dispose()实现的一部分.使用最后一个数据时,也会在内部调用此代码.
"foreach"会自动调用Dispose(),所以如果你使用"foreach"(或regualar LINQ等),它将被解锁.
但是,如果调用者直接使用GetEnumerator()(非常罕见)并且不读取所有数据并且不调用Dispose(),则不会释放锁定.
我必须检查是否或获得终结者; 它可能会被GC释放,但我不会赌钱.
| 归档时间: |
|
| 查看次数: |
3337 次 |
| 最近记录: |