7

在使用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)

当被调用跨线程合并时,我从MSDN中读到。我的问题是里面的 Hashtable 不支持并发。如果它不支持我们应该在第一点使用吗?如果是,是否有任何指导方针。EndInvokeCallContextCallContextCallContext

谁能解释我什么时候可以看到这个堆栈跟踪?

如果您可以分享,则这种情况的示例会更有帮助。

4

1 回答 1

3

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

于 2015-11-09T18:29:08.660 回答