从工作线程但不是主线程访问时,C# - 类字段为null

时间:2010-03-31 18:45:34

标签: c# multithreading delegates invoke worker

不确定我做错了什么:

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
    }
}

2 个答案:

答案 0 :(得分:5)

我认为我们需要查看可重现的代码,但我可以看到4种情况:

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

前两个更有可能。

答案 1 :(得分:3)

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

  • eventInfo设置为volatile,以确保OnGenerateEvent()在调用someMethodInfo.Invoke()之前将其一直写入内存

  • 使用类似互斥锁/锁的内容来保护对eventInfo的访问权限。这也将提供适当的记忆障碍(这是我认为应该做的)

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