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

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

最佳答案

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

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

前两个更有可能。

关于C# - 从工作线程而不是主线程访问时,类字段为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555600/

相关文章:

objective-c - 为什么我对 NSLock 的使用不起作用?

java - Reactor 2.0 中的多线程 - 为什么我不能将信号输出到多个线程

c# - 无法将类型 `UnityEngine.Events.UnityAction<string>' 隐式转换为 `UnityEngine.Events.UnityAction'

c# - 问题解决与 Unity 的依赖关系

c# - 还有另一种方法可以将 ffmpeg 中的帧导出到 texture2d 吗?我的代码在 Windows 中工作但在 Linux 中不工作

c# - 根据 ViewModel 属性更改画笔

c# - 网络 API : recommended way to return json string

c# - 线程中的异常处理,联系 WCF 服务

ios - 如何调用委托(delegate)方法

python - PyQt Paint 自定义日期格式