値がリストexにエクスポートされ、その辞書がクリアされた状態でConcurrentDictionaryスレッドセーフを作成するアイデア。そのため、他のスレッドはエクスポートとクリアの間にデータを追加できません。このようConcurrentDictionaryとClear() - 関数です。データ損失なしで値をスレッドセーフにエクスポートする
: は「
List<data> list;
list = (List<data>)_changedItems.Values; //get values before clearing
_changedItems.Clear();
」 そして追加が機能_changedItems.AddOrUpdate
で他のスレッドによって行われている今、辞書から抜け出すのデータの間に新たなデータを失う可能性があるとあるスレッドがクリアの行の前にコレクションにデータオブジェクトを追加すると、コンテンツをクリアします。
また、内部ロックの追加とクリアを行う唯一の方法です。
lock(object)
{
List<data> list;
list = (List<data>)_changedItems.Values;
_changedItems.Clear();
}
そして
lock(object)
_changedItems.AddOrUpdate
2スレッドを呼び出して、実際に
-Larry
辞書インスタンスをローカルに割り当てる、空の別の辞書を作成する、ロックする、インスタンスを上書きする、ロックを解除する、古いものを返す、すべてのスレッドが同じ参照を使用する場合にのみ動作します。値によってコピーがある場合、これは機能しません。 –
別の考え方 - これを行うことができれば、Interlocked.Exchangeを使用してインスタンスをスワップして、ロックを解除することができます。ロックを短くしたり削除したりすることは、パフォーマンス(そしてデッドロック回避、おそらくここでは関係ありませんが)には常に良いニュースです。 –