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 个场景:

  • MyClass在这两种情况下,您正在与不同的实例交谈-我的赌注在这里
  • 您在其中一种方法中调用了一个变量(如果有任何歧义,请eventInfo尝试在您指的是该字段时使用)this.eventInfo
  • 写入或读取被缓存(尝试标记该字段volatile;再次不太可能)
  • 特定于线程的字段(线程本地存储) - 不太可能

前两种可能性更大。

于 2010-03-31T18:55:36.897 回答
3

您至少需要执行以下操作之一:

  • make eventInfovolatile 以确保OnGenerateEvent()在调用之前将其一直写入内存someMethodInfo.Invoke()

  • 使用诸如互斥锁/锁之类的东西来保护对eventInfo. 这也将提供适当的内存屏障(我认为这是真正应该做的)

哦,我假设实际上并没有MyClass涉及 2 个不同的实例 - 这无法通过您显示的代码进行验证。

于 2010-03-31T18:53:21.407 回答