gpt4 book ai didi

c# - C# Yield 会释放锁吗?

转载 作者:IT王子 更新时间:2023-10-29 04:09:36 24 4
gpt4 key购买 nike

我有以下方法:

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;
}

我刚刚添加了 lock(Database) 来尝试摆脱一些并发问题。不过,我很好奇,yield return 是否会释放对 Database 的锁定,然后在下一次迭代时重新锁定?或者 Database 会在整个迭代期间保持锁定状态吗?

最佳答案

yield return 不会导致任何锁被释放/解锁。 lock 语句将扩展为一个 try/finally block ,并且迭代器不会将其与显式 try/finally 中的代码块区别对待迭代器方法。

细节有点复杂,但是 finally block 何时在迭代器方法中运行的基本规则是

  1. 当迭代器挂起并调用 Dispose 时,挂起点范围内的 finally block 将运行
  2. 当迭代器正在运行并且代码将触发 finally 时,finally block 将运行。
  3. 当迭代器遇到 yield break 语句时,finally block 将在 yield break 处运行

关于c# - C# Yield 会释放锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4608215/

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