0

さまざまなスレッドからアクセスできる静的キューがあります。

キューには、追加/削除/設定時に適切にロックするラッパーが実装されています。また、キューのコピーをロックして返すメソッドもありますが、これは新しい列挙型を作成するため、少し無駄なので、必要な場合にのみ呼び出します。

不必要にキューをコピーしたくはありませんが、列挙中にキューが変更された場合、列挙すると例外がスローされる可能性があります。

列挙中にこれらが例外をスローする可能性はありますか (もちろん上記の理由により):

  • QueueWrapper.InnerQueue.Any()(空)
  • QueueWrapper.InnerQueue.FirstOrDefault(o => o.Something)
  • QueueWrapper.InnerQueue.Except(element)

どこに置き換える必要がQueueWrapper.InnerQueueありQueueWrapper.GetQueueCopy()ますか?

4

2 に答える 2

0

列挙は、基になるコレクションを変更した場合にのみスローされます。LINQ 演算子 ( Any,あなたFirstOrDefaultExcept場合は ) はコレクションを変更しないため、スローしません。

于 2013-06-25T10:14:38.793 に答える
0

表示するすべての操作は実際にキューを列挙するため、これらの間は変更できないため、スレッドセーフではありません (キューの更新操作をロックする方法によって異なります)。

列挙を保護する必要がある場合は、より高いレベルのロック層が必要です。

最適な方法として、リーダーが既に存在する場合に新しいリーダーをロックしないようにするには、ReaderWriterLockSlim ( http://msdn.microsoft.com/library/system.threading.readerwriterlockslim.aspx ) を使用できます。

次のようなコードがあります。

ReaderWriterLockSlim rwls = new ReaderWriterLockSlim();
...
rwls.EnterReadLock();
try
{
    // some enumeration
}
finally
{
    rwls.ExitReadLock();
}
...
rwls.EnterWriteLock();
try
{
    // some bulk update
}
finally
{
    rwls.ExitWriteLock();
}

この方法では、n 個の並列列挙を使用できますが、一度に実行される更新は 1 つだけです。

于 2013-06-25T10:15:06.323 に答える