lock ステートメント
C# の lock ステートメントは System.Threading.Monitor クラスの Enter(object)/Exsit(object) メソッドと try - finally ステートメントに展開される。
lock(requestQueue) { requestQueue.Enqueue("WorkItem"); }
は展開されると以下のようになる。
Monitor.Enter(requestQueue); try { requestQueue.Enqueue("WorkItem"); } finally { Monitor.Exit(requestQueue); }
ちなみに MSDN の Monitor.Exit(object) メソッドに気になる記述が。。。
ロックが解放されて、他のスレッドがオブジェクトの実行待ちキューに入ると、それらのスレッドの 1 つがロックを取得します。ロックを取得するために待機キュー内で待機している他のスレッドは、ロックの所有者が Exit を呼び出しても、実行待ちキューに自動で移動しません。1 つ以上の待機中のスレッドを実行待ちキューに移動するには、Exit を呼び出す前に、Pulse または PulseAll を呼び出します。
What's? マジですか?
今抱えている問題もどうやらあたりが原因で起きているのかも。。。