c# - 这是一个危险的锁定模式吗?

标签 c# locking yield-return

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

try
{
    ReadWriteLock.EnterReadLock();
    yield return foo;
    yield return bar;
    yield return bash;
}
finally
{
    if (ReadWriteLock.IsReadLockHeld)
        ReadWriteLock.ExitReadLock();
}

我相信这可能是一种危险的锁定模式,因为 ReadWriteLock 只有在枚举完成后才会被释放,否则锁会挂起并且永远不会被释放,我说得对吗?如果是这样,解决这个问题的最佳方法是什么?

最佳答案

不,finally block 将始终执行,几乎除非有人从计算机上拔下插头 (well and a few other exceptions)。

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

...

foreach(int i in GetNumbers()) {
    Console.WriteLine(i);
    if(i == 2) break;
}

上面的输出将是

Start
1
2
Finish

请注意,在 C# 中,您编写的是 yield return,而不仅仅是 yield。但我想那只是一个错字。

关于c# - 这是一个危险的锁定模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2956733/

相关文章:

c# - 'TestController.Post()' : not all code paths return a value

c# - 反射和自动生成的类型

c# - .Except/Yield 返回内存不足异常

c# - 如何使 `await …` 与 `yield return` 一起工作(即在迭代器方法中)?

go - 如何修复2个 channel 相互死锁

c# - ASP.NET mvc3 网页无法将文件上传到服务器

c# - 在 Xamarin Forms Shell 中隐藏 TabBar

c# - WCF 中长时间运行的异步线程

java - Android 图案锁定 API

mysql - 当用户更新时,确保一个用户的选择语句对另一个用户是正确的?