即使在AcquireReaderLock( timeout )或AcquireWritterLock(timeout)中的超时间隔过期后,也不会抛出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>();
}发布于 2016-08-15 18:07:31
如果你使用的是Visual studio 2015,那么你可以在调试-> Windows ->异常设置(默认情况下是Ctrl+ALt+E )的异常设置中启用它。然后转到公共语言运行时异常,你会在那里找到它。在Visual Studio 2013中,您可以在公共语言运行库Exceptions->System.中找到它对其他产品不太确定
发布于 2016-08-15 20:38:41
以下是一个最小但完整的程序的示例:
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。
看看你能不能做同样的事。创建一个小的main,将您正在做的事情精简到最基本的部分,直到您可以缩小问题的范围。如果你还在苦苦挣扎,请在这里发布最小但完整的代码,这样我们就可以复制、粘贴并运行它。
不管您的问题是什么,您都应该考虑使用更新的ReaderWriterLockSlim类。请注意它在ReaderWriterLock类的注释部分中所说的内容:
.NET框架有两个读取器-写入器锁,
ReaderWriterLockSlim和ReaderWriterLoc。对于所有新的开发,建议使用ReaderWriterLockSlim。ReaderWriterLockSlim类似于ReaderWriterLock,但它简化了递归以及升级和降级锁状态的规则。ReaderWriterLockSlim避免了许多潜在死锁的情况。此外,ReaderWriterLockSlim的性能明显优于ReaderWriterLock。
https://stackoverflow.com/questions/38952893
复制相似问题