ReaderWriterLock从不抛出ApplicationException

时间:2016-08-15 09:52:21

标签: c#

即使在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>();
        }

2 个答案:

答案 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有两个读写器锁,ReaderWriterLockSlimReaderWriterLoc。所有新开发都推荐使用ReaderWriterLockSlimReaderWriterLockSlimReaderWriterLock类似,但它简化了递归规则以及升级和降级锁定状态的规则。 ReaderWriterLockSlim避免了许多潜在的僵局。此外,ReaderWriterLockSlim的效果明显优于ReaderWriterLock