2

私が間違っているのかわかりません:

class MyClass
{

    private EventInfo eventInfo;

    public void OnGenerateEvent(object sender, EventArgs e)
    { 
        // Called from *main* thread 

        // Load assembly and set eventInfo here
        eventInfo = ....GetEvent(...);
        eventInfo.AddEventHandler(source, handler);

        // Call to a static method in another assembly
        someMethodInfo.Invoke(null, null);

    }


    public void OnEventChanged(object sender, EventArgs args)
    {    
        // Called from a *worker* thread created 
        // by that static method in the other assembly

        eventInfo is null here !   

        // Trying to remove handler
        eventInfo.RemoveEventHandler(.....);

    }


    // But...
    protected override void Dispose(bool disposing)
    {
        // Called from *main* thread when program closes

        eventInfo is *not* null here
    }
}
4

2 に答える 2

5

再現可能なコードを確認する必要があると思いますが、4 つのシナリオを確認できます。

  • あなたはMyClass2つのケースで別のインスタンスと話している -私の賭けはここにあります
  • eventInfoいずれかのメソッドで呼び出された変数があります(this.eventInfoあいまいさがある場合は、フィールドを意味するときに使用してみてください)
  • 書き込みまたは読み取りがキャッシュされます (フィールドをマークしてみてください。これvolatileも可能性は低いです)
  • スレッド固有のフィールド (スレッドローカル ストレージ) - 非常にありそうもない

最初の 2 つの可能性がはるかに高くなります。

于 2010-03-31T18:55:36.897 に答える
3

次の少なくとも 1 つを実行する必要があります。

  • eventInfo揮発性にして、OnGenerateEvent()呼び出す前にメモリに完全に書き込むようにしますsomeMethodInfo.Invoke()

  • へのアクセスを保護するためにミューテックス/ロックのようなものを使用してくださいeventInfo。これにより、適切なメモリバリアも提供されます(これは、私の意見では実際に行うべきことです)

ああ、実際には 2 つの異なるインスタンスが関係していないと仮定していMyClassます。これは、表示されたコードでは確認できません。

于 2010-03-31T18:53:21.407 に答える