gpt4 book ai didi

c# - `System.MulticastDelegate` 是线程安全的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:00 25 4
gpt4 key购买 nike

我正在寻找可能对此了解更多的人,我的直觉告诉我答案是“不,它不是线程安全的”,但我想确定一下。

为了说明我的问题,我提供了这个类的一些上下文

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);
}
}

编辑:我在上面的示例中添加了锁,但这真的不是我的问题的重点。


我试图更好地理解保存调用列表的数组是否是线程安全的。坦率地说,我不清楚这一切是如何组合在一起的,如果能提供一些帮助,我们将不胜感激。

根据我找到的文档,唯一没有提供真正见解的引述如下:

A MulticastDelegate has a linked list of delegates, called an invocation list, consisting of one or more elements. When a multicast delegate is invoked, the delegates in the invocation list are called synchronously in the order in which they appear. If an error occurs during execution of the list then an exception is thrown.

https://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx

提前致谢。

最佳答案

Delegates不可变的。您永远不会更改代表。任何看似改变委托(delegate)的方法实际上都是在创建一个新实例。

Delegates are immutable; once created, the invocation list of a delegate does not change.

因此无需担心在调用委托(delegate)时调用列表可能会更新。

然而,您确实必须提防,但在您的方法中未能做到的是委托(delegate)实际上可能为 null

(new MyContext()).Go();

会导致异常。您过去必须通过将值读入局部变量、测试它是否为 null 然后使用它调用来防止这种情况。它现在可以更容易地解决为:

public void Go()
{
_multicastDelegate?.Invoke(this);
}

关于c# - `System.MulticastDelegate` 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48683134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com