Wee*_*ble 5 .net thread-safety
线程安全
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的.任何实例成员都不保证是线程安全的.
System.Delegate的文档中存在相同的语句.
现在,代理人拥有一个不可变的API,但正如Eric Lippert所说:"认为仅仅因为数据结构不允许你改变其内容的任何方式是一种谬论,它的实现必须是线程安全的!"
从现有委托创建新委托的一些机制是静态方法:Delegate.Combine和Delegate.Remove.所以听起来这些都是线程安全的.给定多播代理A,B和C,我可以安全地将A和B组合在一个线程上制作D,同时将B和C组合在另一个线程上制作E.
但是调用委托不是静态方法.这是否意味着技术上我的代码可能会破坏,如果我在线程之间共享委托并在两者上调用它,或者如果我在一个线程上调用委托,而在另一个线程上将它与另一个线程组合?MulticastDelegate在这种情况下,符合标准的实现会导致未定义的行为吗?代表是否返回Combine或Remove保证不与任何其他代表共享任何隐藏的可变状态?
请注意,我在询问标准保证什么,而不是C#编译器和CIL JIT编译器的当前行为.通过实验,我可以确定在我可用的体系结构中使用.NET和Mono 确实看起来确实安全,但是我看不出是什么指定或保证了这种行为.