事件处理程序不是线程安全的吗?所以我读过,而不是直接调用事件if(SomeEvent!=null)SomeEvent(this,null);我应该做SomeEventHandlertemp=SomeEvent;如果(温度!=null)温度(这个,空);为什么会这样?第二个版本如何成为线程安全的?最佳做法是什么?事件实际上是委托列表中的语法糖。当您调用该事件时,这实际上会遍历该列表并使用您传递的参数调用每个委托。线程的问题是它们可以通过订阅/取消订阅从这个集合中添加或删除项目。如果他们在迭代集合时这样做会导致问题(我认为会抛出异常)目的是在迭代之前复制列表,这样可以防止对列表进行更改。注意:即使您取消订阅,您的侦听器现在也会被调用,因此您应该确保在您的侦听器代码中处理这个问题。IMO,其他答案遗漏了一个关键细节——代表(以及事件)是不可变的。这样做的要点是订阅或取消订阅事件处理程序不会简单地附加/附加/删除到列表-它们用一个带有额外(或更少)项目的新列表替换列表。由于引用是原语,这意味着当你这样做时:varhandler=SomeEvent;您现在有一个无法更改的严格实例,即使在下一皮秒内另一个线程取消订阅(导致实际事件字段变为null)。所以你测试null并调用它,一切都很好。当然请注意,在一个认为它在皮秒前取消订阅的对象上仍然存在令人困惑的事件!最佳实践是第二种形式。原因是另一个线程可以在“if”测试和调用之间取消或更改SomeEvent。这是一篇关于.NET事件和线程竞争条件的好文章。它涵盖了一些常见的场景,并在其中提供了一些很好的参考。希望这可以帮助。以上就是C#学习教程:事件处理器线程不安全吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
