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只有在枚举完成时才会被释放,否则锁被挂起并且永远不会释放,我是否正确?如果是这样,打击这个的最佳方法是什么?
不,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.但我想这只是一个错字.