从EventHandler委托的MSDN文档:
与C#和Visual Basic示例相比,Visual C++示例代码不要求您创建线程安全的临时变量.Visual C++版本自动提供线程安全访问,使您可以直接引发事件.
为什么C#不能自动提供对C++/CLI事件的线程安全访问?
虽然不完全重复,但我相信这个问题的答案将有助于解释为什么它们在实现方面不是线程安全的。具体就是这 两个答案。
马克·格拉维尔的回答:
IMO,其他答案错过了一个关键细节 - 代表(以及因此事件)是不可变的。这样做的重要性在于,订阅或取消订阅事件处理程序并不只是简单地追加/删除到列表,而是将列表替换为新列表,其中包含一个额外(或更少)的项目。
由于引用是原子的,这意味着此时您需要执行以下操作:
var handler = SomeEvent;现在,您有一个无法更改的刚性实例,即使在下一个皮秒内另一个线程取消订阅(导致实际事件字段变为空)。
因此,您测试 null 并调用它,一切都很好。当然,请注意,仍然存在令人困惑的情况,即在认为自己在皮秒前取消订阅的对象上引发事件!
| 归档时间: |
|
| 查看次数: |
925 次 |
| 最近记录: |