当从工作线程而不是主线程访问时,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;同样不太可能)
- 线程特定字段(线程本地存储)-不太可能