私は次のロックシナリオを持っていますが、ロックを2回逃して2つのコードインスタンスを同時に実行させるようです。コードを分析/修正する際の助けに感謝します。c#ロックは機能しません(?)
public delegate void _D(A a);
namespace ExternalDll {
public event _D D;
}
namespace MainSpace {
ExternalDll _externalDll;
public static object lockObj = new object();
public static int counter = 0;
.
.
_externalDll.D += new _D(myEventHandler);
.
.
void myEventHandler(A a) {
lock (lockObj) {
counter++;
// do staff, printouts, etc.
Console.WriteLine("First={0}\n", counter);
// do other staff
Console.WriteLine("Second={0}\n", counter);
}
}
}
ExternalDllは、(タイプAの)情報aとのネットワーク通信を受信するdllファイルです。イベントDをaとして入力します。
メインネームスペースは、ExternalDllによって起動されるイベントDにmyEventHandlerを登録します。 myEventHanlderの内部にはロックがあるため、ロックセクション内のコードはいつでも複数回実行されることはありません。
しかし、アプリケーションを実行すると、ロックされたコードが「並列」で2回実行されることがあります。
First=0
First=1
Second=0
Second=1
これは特にexternalDllに非常に短い時間間隔(< 1US)以内に到着するバースト的なネットワークイベントの場合に起こります。たとえば、私のようなプリントアウトが表示されることがあります。
私の質問/要望は以下のとおりです。
この障害のある行動ロック文を作ることができますどのような。ロックされたコードの2つのインスタンスを許可しますか?
コードを改善して、望ましいロック動作を実現する方法。
おかげで、
-Moshe。
これは変数 'theLock'をロックしていますが、値が割り当てられていないことがわかります。ロックウインドをロックしたくないのですか? – prospector
カウンタに書き込むコードは他にありますか? – usr
先ほどのprospectorはあなたのサンプルコードが "theLock"を使用していますが、 "lockObj"を使っているはずであることを暗示しています。たぶん、あなたの例を少しきれいにするのでしょうか?それ以外に、 "//他のスタッフは"イベントハンドラが完了する前に別のコールバックにつながるものを呼び出しますか? –