1. ホーム
  2. c#

[解決済み] ロックされたオブジェクトは、その内部で例外が発生してもロックされたままになりますか?

2023-03-19 22:21:34

質問

c#のスレッドアプリで、オブジェクトをロックする場合、例えばキューをロックして、例外が発生した場合、オブジェクトはロックされたままでしょうか? 以下は擬似コードです。

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

私の理解では、catchの後のコードは実行されません - しかし、私はロックが解放されるかどうか疑問に思っています。

どのように解決するのでしょうか?

まず、TryParseを検討しましたか?

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

ロックが解除される理由は2つあり、1つ目は lock は本質的に

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

次に、内部の例外をキャッチして再スローしないので lock は実際に例外を見ることはありません。もちろん、MessageBox の期間中はロックを保持することになるので、問題になるかもしれません。

ですから、致命的な大惨事の回復不可能な例外を除いて、すべてで解放されます。