我正在寻找一个可能对此了解更多的人,我的直觉告诉我,答案是“不,这不是线程安全”,但我想确定。
为了说明我的问题,我在这门课上提供了一些上下文。
public class MyContext
{
private readonly object _lock = new object();
public delegate bool MyDelegate(MyContext context);
private MyDelegate _multicastDelegate;
public MyContext()
{
_multicastDelegate = null;
}
public void AddDelegate(MyDelegate del)
{
lock(_lock)
{
_multicastDelegate += del;
}
}
public void RemoveDelegate(MyDelegate del)
{
lock(_lock)
{
_multicastDelegate += del;
}
}
public void Go()
{
_multicastDelegate.Invoke(this);
}
}编辑:我在上面的例子中添加了锁,但这并不是我问题的重点。
我试图更好地理解保存调用列表的数组是否是线程安全的。坦率地说,我不清楚这一切是如何组合在一起的,如果能提供一些帮助,我将不胜感激。
根据我发现的文件,唯一没有提供真正洞察力的报价是:
MulticastDelegate有一个被称为调用列表的链接委托列表,该列表由一个或多个元素组成。当调用多播委托时,调用列表中的委托将按它们出现的顺序同步调用。如果在执行列表时发生错误,则会引发异常。
https://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx
提前谢谢。
发布于 2018-02-08 10:49:28
代表们是不变的。你从不更换代表。任何出现变异委托的方法实际上都是在创建一个新实例。
委托是不可变的;一旦创建,委托的调用列表就不会改变。
因此,没有理由担心在调用委托时调用列表可能会被更新。
但是,您必须注意的是,在您的方法中没有做到的是,委托实际上可能是null。
(new MyContext()).Go();会导致异常。过去,您必须通过将值读入局部变量,测试它的空值,然后调用它来防范这种情况。现在可以更容易地解决这个问题,因为:
public void Go()
{
_multicastDelegate?.Invoke(this);
}https://stackoverflow.com/questions/48683134
复制相似问题