在c#线程应用程序中,如果我要锁定一个对象,假设是一个队列,如果发生异常,该对象是否会保持锁定状态?以下是伪代码:

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

据我所知,捕获后的代码不会执行——但我一直在想锁是否会被释放.

推荐答案

第一你考虑过特里帕斯吗?

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期间持有锁,这可能是个问题.

因此,除了最致命的灾难性不可恢复的例外,它将在所有情况下发布.

.net相关问答推荐

从Couchbase删除_txn文档的推荐方法?""

节省用户在整个应用程序中使用的Flutter

.NET MAUI 的登录页面

正则表达式匹配 URL 中的多个子目录

.NET Async / Await:状态机如何知道何时继续执行?

图像 UriSource 和数据绑定

value 的默认参数必须是编译时间常数?

为什么我得到 411 Length required 错误?

.net:System.Web.Mail 与 System.Net.Mail

如何在 C# 中序列化异常对象?

新的 netstandardapp 和 netcoreapp TFM 有什么区别?

Await 运算符只能在 Async 方法中使用

所有数组在 C# 中都实现了哪些接口?

单元测试 C# 保护方法

从 OpenFileDialog 路径/文件名中提取路径

String.Join 与 StringBuilder:哪个更快?

如何获取命名空间中的所有类?

DLL 中有什么以及它是如何工作的?

序列化一个可为空的 int

在foreach循环中修改列表的最佳方法是什么?