2009-07-25 5 views
1

マルチスレッドサポートにReadWriteLockSlimを使用する場合、AddHandlerを使用するときにEnterWriteLockをする必要がありますか?AddHandlerを使用するときにEnterWriteLockをする必要がありますか?

はここに私のポイントを説明するのを助けるために2つの例です:

AddHandler ClassInstance.Event, New EventHandler(AddressOf Me.Method) 

- または -

Me.ReaderWriterLockSlimInstance.EnterWriteLock() 
AddHandler ClassInstance.Event, New EventHandler(AddressOf Me.Method) 
Me.ReaderWriterLockSlimInstance.ExitWriteLock() 

答えて

2
それはイベントに依存してもよい

;たとえば、あなたは(私は以下これを説明...はい、私はあなたがVBについて尋ね知っている)すなわち

public event EventHandler SomeEvent; // synchronized 

、「フィールドのようなイベント」を経由してC#で記述されたDLLからイベントを消費している場合

これは(C#言語仕様ごとに)自動的に同期されるため、マルチスレッドの問題はありません(そして、代理人は不変です)。しかし、同じライブラリで、非フィールドのようなイベントがが同期されない可能性があります - すなわち

private EventHandler myField; 
public event EventHandler SomeEvent { // not synchronized 
    add { myField += value; } 
    remove { myField -= value; } 
} 

は、私はあなたがVBについて尋ね知っている...しかし、あなたはcomsumerとしてVBについて尋ねている 。私のポイントは、出版社に依存しているということです。あなたがこれを知っていればしかし、あなたが出版社を制御できない場合

だから、その後、手動で同期音は、あなたがこのシナリオのスレッドリスクは(ほとんどの場合、同期化する必要がないがあると思い場合adviseableスレッド領域であれば、同期は合理的です)。

protected virtual void OnSomeEvent() { 
    EventHandler handler = SomeEvent; // assume the "field-like" version 
    if(handler!=null) handler(this, EventArgs.Empty); 
} 

マイポイントここ加入者もイベントを受信することが理論的に可能であるとされています

がイベントを上げる一般的なパターンは、スナップショットを取ることであることに注意します彼らがの登録を解除したと思った後、極端な場合には、おそらくフラグをどこかに(または例外処理だけで)保持することによって、手動でこれを扱いたいかもしれません。

Protected Overridable Sub OnSomeEvent() 
    Dim handler As EventHandler = Me.SomeEvent 
    If (Not handler Is Nothing) Then 
     handler.Invoke(Me, EventArgs.Empty) 
    End If 
End Sub 
+0

グレートポスト:比較のためのVB(反射器を介して)で要求された、最後のコードフラグメントとして


。あなたは非常に良い点を挙げています。この場合、私のプログラムは実際にはプロデューサーであり消費者でもあります。私のC#は現時点では非常に錆びているので、VB.Netに投稿した最後のコードを翻訳する可能性はありますか? –

+0

リフレクターとポストを介して翻訳します。 –

+0

ありがとうございます。再び、素晴らしい答え。 –