这是一种危险的锁定模式吗?

Mar*_*tin 4 c# locking yield-return

我有一个用C#编写的枚举器,它看起来像这样:

try
{
    ReadWriteLock.EnterReadLock();
    yield return foo;
    yield return bar;
    yield return bash;
}
finally
{
    if (ReadWriteLock.IsReadLockHeld)
        ReadWriteLock.ExitReadLock();
}
Run Code Online (Sandbox Code Playgroud)

我相信这可能是一个危险的锁定模式,因为ReadWriteLock只有在枚举完成时才会被释放,否则锁被挂起并且永远不会释放,我是否正确?如果是这样,打击这个的最佳方法是什么?

Dav*_*und 7

不,finally块就一定会执行,几乎除非有人拉从计算机(插头以及和一些其他异常).

public static IEnumerable<int> GetNumbers() {
    try
    {
        Console.WriteLine("Start");
        yield return 1;
        yield return 2;
        yield return 3;
    }
    finally
    {
        Console.WriteLine("Finish");
    }
}
Run Code Online (Sandbox Code Playgroud)

...

foreach(int i in GetNumbers()) {
    Console.WriteLine(i);
    if(i == 2) break;
}
Run Code Online (Sandbox Code Playgroud)

以上的输出将是

开始
1
2
完成

请注意,在C#中你写的yield return不仅仅是yield.但我想这只是一个错字.

  • 如果有人不使用foreach但只调用MoveNext()和Current会怎么样? (2认同)