不确定我做错了什么:
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
}
}
答案 0 :(得分:5)
我认为我们需要查看可重现的代码,但我可以看到4种情况:
MyClass
实例交谈 - 我打赌在这里 eventInfo
的变量(如果有歧义,请尝试使用this.eventInfo
)volatile
;再次不太可能)前两个更有可能。
答案 1 :(得分:3)
您至少需要执行以下操作之一:
将eventInfo
设置为volatile,以确保OnGenerateEvent()
在调用someMethodInfo.Invoke()
之前将其一直写入内存
使用类似互斥锁/锁的内容来保护对eventInfo
的访问权限。这也将提供适当的记忆障碍(这是我认为应该做的)
哦,我假设实际上没有涉及2个不同的MyClass
个实例 - 无法通过您显示的代码进行验证。