Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当从工作线程而不是主线程访问时,C#-class字段为空_C#_Multithreading_Delegates_Invoke_Worker - Fatal编程技术网

当从工作线程而不是主线程访问时,C#-class字段为空

当从工作线程而不是主线程访问时,C#-class字段为空,c#,multithreading,delegates,invoke,worker,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(.

不确定我做错了什么:

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

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

  • 使
    eventInfo
    易失性,以确保
    OnGenerateEvent()
    在调用
    someMethodInfo.Invoke()之前将其全部写入内存

  • 使用互斥锁/锁之类的东西来保护对
    eventInfo
    的访问。这也将提供适当的记忆障碍(我认为这才是真正应该做的)


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

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

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