一尘不染

如果锁定对象内部发生异常,是否保持锁定状态?

c#

在ac#线程应用程序中,如果我要锁定对象,可以说一个队列,如果发生异常,该对象会保持锁定状态吗?这是伪代码:

int ii;
lock(MyQueue)
{
   MyClass LclClass = (MyClass)MyQueue.Dequeue();
   try
   {
      ii = int.parse(LclClass.SomeString);
   }
   catch
   {
     MessageBox.Show("Error parsing string");
   }
}

据我了解,捕获后的代码无法执行-但我一直在想是否会释放该锁。


阅读 364

收藏
2020-05-19

共1个答案

一尘不染

第一; 您是否考虑过TryParse?

in li;
if(int.TryParse(LclClass.SomeString, out li)) {
    // li is now assigned
} else {
    // input string is dodgy
}

锁定将被释放的原因有两个:首先,lock本质上是:

Monitor.Enter(lockObj);
try {
  // ...
} finally {
    Monitor.Exit(lockObj);
}

第二; 您会捕获并且不会重新抛出内部异常,因此lock从不实际看到异常。当然,您在整个MessageBox期间都持有该锁,这可能是一个问题。

因此,它将在除了最致命的灾难性不可恢复的异常之外的所有异常中释放。

2020-05-19