我正在编写一个函数,通过在列表中保留订阅 ID 列表来删除所有订阅。
我遇到了问题
foreach (var subscriptionId in _listOfSubscriptionIds)
{
await _hubProxy.Invoke("removeSubscription", subscriptionId);
_listOfSubscriptionIds.Remove(subscriptionId);
}
Run Code Online (Sandbox Code Playgroud)
因为在 foreach 循环中修改列表会引发错误。我在这个社区上发现我可以这样做,foreach(var subscriptions in _listOfSubscriptionIds.ToList())但这在空间复杂性方面听起来很糟糕,特别是如果有大约 10000000 订阅者。
所以我将其更改为以下内容:
public async Task RemoveSubscription (string subscriptionId)
{
await _hubProxy.Invoke("removeSubscription", subscriptionId);
_listOfSubscriptionIds.Remove(subscriptionId);
}
public void RemoveAllSubscriptions()
{
_listOfSubscriptionIds.ForEach(async subscriptionId => await RemoveSubscription(subscriptionId));
}
Run Code Online (Sandbox Code Playgroud)
一些问题:
我认为第二个在空间和时间复杂度方面更好,但我是对的吗?
在第二种情况下是否存在我可能遗漏的竞争条件?
在RemoveSubscription中,_listOfSubscriptionIds.Remove(subscriptionId)也等待,因为它在异步函数中......?
编辑:我没有分享的一个导致调用_listOfSubscriptionIds.Clear()或迭代出现_listOfSubscriptionIds问题的细节是,可能有多个客户端_hubProxy,每个客户端都有其独特的订阅集。
客户端 1 的 subscriptionIds {a, b, c, d, e}
具有 subIds {f, g, h, I, j, k} 的客户端 2 …