即使在AcquireReaderLock(超时)或AcquireWritterLock(超时)中超时间隔到期后,也不会抛出ApplicationException。谁知道为什么?
try
{
_readWritterLock.AcquireReaderLock(3000);
IEnumerable<TEntity> result;
try
{
result = _xmlReader.GetAll();
}
catch
{
result = new List<TEntity>();
}
finally
{
_readWritterLock.ReleaseReaderLock();
}
return result;
}
catch (ApplicationException)
{
System.Diagnostics.Debug.WriteLine("App Exception");
return new List<TEntity>();
}
答案 0 :(得分:0)
如果您使用的是Visual Studio 2015,则可以在 Debug-&gt;中找到的例外设置中启用它。 Windows - &gt;例外设置(或默认情况下 Ctrl + ALt + E )。然后转到公共语言运行时例外,您将在那里找到它。 在 Visual Studio 2013 中,您将在公共语言运行时例外 - &gt; 系统中找到它。不确定其他产品
答案 1 :(得分:0)
以下是一个最小但完整的程序的示例:
public static void Main()
{
var rwl = new ReaderWriterLock();
rwl.AcquireWriterLock(1000);
var t1 = new Thread(() =>
{
try
{
rwl.AcquireReaderLock(1000);
Console.WriteLine("Acquired lock successfully");
}
catch (ApplicationException)
{
Console.WriteLine("Time out");
}
});
t1.Start();
t1.Join();
rwl.ReleaseWriterLock();
}
如果您复制粘贴代码并运行它,您将看到输出为:
超时
......正如所料。因此,ReaderWriterLock
类会按预期抛出ApplicationException
。
看看你是否可以这样做。创建一个小主体,将您正在做的事情剥离到最基本的要素,直到您可以缩小问题范围。如果您还在苦苦挣扎,请在此处发布最小但完整的代码,以便我们可以复制粘贴并运行它。
无论您的问题是什么,您都应该考虑使用更新的ReaderWriterLockSlim课程。请注意ReaderWriterLock类备注部分下的内容:
.NET Framework有两个读写器锁,
ReaderWriterLockSlim
和ReaderWriterLoc
。所有新开发都推荐使用ReaderWriterLockSlim
。ReaderWriterLockSlim
与ReaderWriterLock
类似,但它简化了递归规则以及升级和降级锁定状态的规则。ReaderWriterLockSlim
避免了许多潜在的僵局。此外,ReaderWriterLockSlim
的效果明显优于ReaderWriterLock
。