我有一个用 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/