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

在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本质上是:

Monitor.Enter(lockObj);

try {

// ...

} finally {

Monitor.Exit(lockObj);

}

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

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

以上是 如果锁定对象内部发生异常,是否保持锁定状态? 的全部内容, 来源链接: utcz.com/qa/400140.html

回到顶部