2016-07-04 8 views
-3

私は次のロックシナリオを持っていますが、ロックを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。

+3

これは変数 'theLock'をロックしていますが、値が割り当てられていないことがわかります。ロックウインドをロックしたくないのですか? – prospector

+0

カウンタに書き込むコードは他にありますか? – usr

+0

先ほどのprospectorはあなたのサンプルコードが "theLock"を使用していますが、 "lockObj"を使っているはずであることを暗示しています。たぶん、あなたの例を少しきれいにするのでしょうか?それ以外に、 "//他のスタッフは"イベントハンドラが完了する前に別のコールバックにつながるものを呼び出しますか? –

答えて

0

十分にわかりません。複数のアプリドメインを生成するものを使用しているため、2つのアプリドメインが作成されていると推測されます。 Asp.netは時にはhttpモジュールでこれを行います。

+0

回。 – VMAtm

+0

私のアプリケーションは普通の計算であり、Webサーバーなどではありません。実行中のコンソールウィンドウは1つしか表示されません。 – Moshe

+0

lockObjのアドレスも表示されることがあります。これは奇妙なことをしているマーシャラーかもしれません。 – keith

関連する問題