4

特定のアイテムを削除するか、述語を渡してそれに基づいてアイテムを削除できる単純なRemove()関数をサポートする.NETスレッドセーフ/同時収集が見つからないようです。私が試してみました:

BlockingCollection<T>
ConcurrentQueue<T>
ConcurrentStack<T>
ConcurrentBag<T>

この動作をサポートするコレクションを知っている人はいますか、それとも自分で作成する必要がありますか?

スレッドセーフキューから次のアイテムを削除せずに取得できるようにしたいのですが、後で特定の条件が満たされた場合は、削除を続行します。

4

3 に答える 3

8

試しましたConcurrentDictionaryか?メソッドがTryRemoveあるので、キーを述語と考えると、正しいアイテムを削除することになります。

于 2012-02-29T21:15:08.337 に答える
5

本当にConcurrentQueue<T>あなたのニーズに合わないのですか?これには、前の段落で説明したことを正確に実行TryPeekする方法と方法があります。TryDequeue

于 2012-02-29T21:14:51.007 に答える
1

ここでの他の回答は、質問に直接回答したり、望ましくない可能性のある制限を提供したりするものではありません。たとえば、ConcurrentDictionaryはキーを使用して、重複するインスタンスが追加されないようにします。

SynchronizedCollectionはスレッドセーフであり、Removeメソッドが含まれているため、必要なもののようです。

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.synchronizedcollection-1?view=dotnet-plat-ext-5.0

コード例:

SynchronizedCollection<string> FilePathsToIgnore = new SynchronizedCollection<string>();
...

FilePathsToIgnore.Add(someFileName);
...

if(FilePathsToIgnore.Contains(fileName))
{
    FilePathsToIgnore.Remove(fileName);
}


于 2021-07-09T13:46:26.307 に答える