0

我试图在这里揭穿不可变的集合。我的攻击点是我们维护ImmutableHashSet<Subscription>订阅的经典发布-订阅事件代理。

然后订阅操作将执行

var s = new Subscription(this, subscriber);
subscriptions = subscriptions.Add(s);

并且发布操作会执行类似的操作

foreach (var s in subscriptions)
  s.Subscriber.OnNext(args);

但是,让我们假设当发布操作发生时,有人订阅,变量subscriptions被替换。循环会foreach正常工作,还是会完全坏掉?(如果是这样,可以做些什么来解决这个问题?)谢谢。

4

1 回答 1

6

subscriptions变量仅在循环开始时读取。请记住,这foreach会将您的代码翻译成以下内容:

using (var iterator = subscriptions.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        var s = iterator.Current;
        s.Subscriber.OnNext(args);
    }
}

subscriptions所以基本上,在你调用之后改变变量的值GetEnumerator()根本不会影响其余的行为——它只会影响一次。(假设相关的内存屏障已经到位等)

于 2013-07-20T20:11:05.093 回答