作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在使用 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当调用 EndInvoke
时,CallContext
会跨线程合并。我的问题是 CallContext
中的 Hashtable 不支持并发。如果它不支持,我们应该在第一点使用 CallContext
吗?如果是,是否有任何指导方针。
谁能解释我什么时候能看到这个堆栈跟踪?
如果您可以分享这种情况的示例会更有帮助。
最佳答案
CallContext
的工作原理是在远程机器上制作当前集合的副本,然后合并回调用期间对该副本所做的更改。这就是它在抛出此异常时试图做的事情。似乎您将上下文传递给了另一个正在修改集合的线程,而框架正在将更改复制回来。您看到的异常是因为特定集合不是线程安全的,但即使它使用线程安全集合,这里也会出现竞争条件——复制更改后对集合所做的更改将会丢失。您需要在调用完成之前更改所有上下文。
关于c# - LogicalCallContext 中 Hashtable 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19175326/
我是一名优秀的程序员,十分优秀!