在ac#线程应用程序中,如果我要锁定对象,可以说一个队列,如果发生异常,该对象会保持锁定状态吗?这是伪代码:
int ii; lock(MyQueue) { MyClass LclClass = (MyClass)MyQueue.Dequeue(); try { ii = int.parse(LclClass.SomeString); } catch { MessageBox.Show("Error parsing string"); } }
据我了解,捕获后的代码无法执行-但我一直在想是否会释放该锁。
第一; 您是否考虑过TryParse?
in li; if(int.TryParse(LclClass.SomeString, out li)) { // li is now assigned } else { // input string is dodgy }
锁定将被释放的原因有两个:首先,lock本质上是:
lock
Monitor.Enter(lockObj); try { // ... } finally { Monitor.Exit(lockObj); }
第二; 您会捕获并且不会重新抛出内部异常,因此lock从不实际看到异常。当然,您在整个MessageBox期间都持有该锁,这可能是一个问题。
因此,它将在除了最致命的灾难性不可恢复的异常之外的所有异常中释放。