gpt4 book ai didi

c# - LogicalCallContext 中 Hashtable 的线程安全

转载 作者:太空狗 更新时间:2023-10-29 20:39:35 57 4
gpt4 key购买 nike

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

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com