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 inside が同時実行をサポートしていないかということです。サポートされていない場合は、最初に使用する必要がありますか? はいの場合、これに関するガイドラインはありますか。EndInvokeCallContextCallContextCallContext

このスタック トレースをいつ表示できるか説明できますか?

このようなシナリオの例は、共有できればより役立ちます。

4

1 に答える 1

3

CallContext、リモート マシンで現在のコレクションのコピーを作成し、呼び出し中にそのコピーに加えられた変更を元に戻すことによって機能します。それが、この例外をスローするときに実行しようとしていることです。フレームワークが変更をコピーしている間に、コレクションを変更している別のスレッドにコンテキストを渡したようです。表示されている例外は、特定のコレクションがスレッドセーフではないためですが、スレッドセーフなコレクションを使用した場合でも、ここで競合状態が発生します。変更がコピーされた後にコレクションに加えられた変更は失われます。呼び出しが完了する前に、すべてのコンテキスト変更を行う必要があります。

于 2015-11-09T18:29:08.660 に答える