C# LogicalCallContext中哈希表的线程安全

C# LogicalCallContext中哈希表的线程安全,c#,multithreading,C#,Multithreading,在使用LogicalCallContext跨线程共享一些数据时,我们遇到了一个异常,堆栈跟踪如下 System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.Collections.Hashtable.HashtableEnumerator.MoveNext() at System.Runtime.Remoting.Messagi

在使用
LogicalCallContext
跨线程共享一些数据时,我们遇到了一个异常,堆栈跟踪如下

System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.Collections.Hashtable.HashtableEnumerator.MoveNext()
   at System.Runtime.Remoting.Messaging.LogicalCallContext.Merge(LogicalCallContext lc)
   at System.Runtime.Remoting.Proxies.RealProxy.EndInvokeHelper(Message reqMsg, Boolean bProxyCase)
   at System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(Object NotUsed, MessageData& msgData)
当调用
EndInvoke
时,我读取了跨线程合并
CallContext
时的内容。 我的问题是
CallContext
中的哈希表不支持并发性吗。如果它不支持,我们应该在第一点使用
CallContext
?如果是,是否有任何指导方针

谁能解释一下我什么时候能看到这个堆栈跟踪


这种情况下的一个例子是比较有用的,如果你可以共享.< /p> 如果你能够改变<代码>哈希表,你可以考虑用<代码>并发词字典< /Cord>类替换它。在此类中添加和删除项是完全线程安全的,可能会解决您的问题

它是
字典
类的线程安全替代方案,因此您仍然可以使用键值集合


有关MSDN此处的更多详细信息。

调用上下文的工作原理是在远程计算机上创建当前集合的副本,然后合并回调用期间对该副本所做的更改。当它抛出此异常时,它正试图这样做。似乎您将上下文传递给了另一个线程,该线程正在修改集合,而框架正在将更改复制回来。您看到的异常是因为特定集合不是线程安全的,但即使它使用了线程安全的集合,这里也会存在争用条件—复制更改后对集合所做的更改将丢失。您需要在调用完成之前进行所有上下文更改。

是否使用foreach?如果您这样做,foreach在循环时不支持集合修改。请参阅我对这个相关问题的回答:这个问题不是关于迭代器滥用的。它是关于
LogicalCallContext
的框架行为。不是重复。现在这是一个准确的诊断!:)