严格来说,在多线程上使用委托可以安全地做什么?

Wee*_*ble 5 .net thread-safety

根据System.MulticastDelegate文档:

线程安全

此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的.任何实例成员都不保证是线程安全的.

System.Delegate的文档中存在相同的语句.

现在,代理人拥有一个不可变的API,但正如Eric Lippert所说:"认为仅仅因为数据结构不允许改变其内容的任何方式是一种谬论,它的实现必须是线程安全的!"

从现有委托创建新委托的一些机制是静态方法:Delegate.CombineDelegate.Remove.所以听起来这些都是线程安全的.给定多播代理A,B和C,我可以安全地将A和B组合在一个线程上制作D,同时将B和C组合在另一个线程上制作E.

但是调用委托不是静态方法.这是否意味着技术上我的代码可能会破坏,如果我在线程之间共享委托并在两者上调用它,或者如果我在一个线程上调用委托,而在另一个线程上将它与另一个线程组合?MulticastDelegate在这种情况下,符合标准的实现会导致未定义的行为吗?代表是否返回CombineRemove保证不与任何其他代表共享任何隐藏的可变状态?

请注意,我在询问标准保证什么,而不是C#编译器和CIL JIT编译器的当前行为.通过实验,我可以确定在我可用的体系结构中使用.NET和Mono 确实看起来确实安全,但是我看不出是什么指定或保证了这种行为.