私のアプリケーションには、バックグラウンドスレッドのコレクション内のアイテムの処理を実行するオブジェクトがあります。オブジェクトが作成されると、コレクション内のすべての既存のアイテムのバックグラウンド処理をスレッドプール使用してトリガーされます。コレクション内のアイテムのバックグラウンド処理と新しいアイテムの追加(スレッドプールを使用)
class CollectionProcessor
{
public CollectionProcessor()
{
// Not actually called during the constructor just put it here to simplify the code sample
Action process = new Action(this.Process);
createIndex.BeginInvoke(true, ar => process.EndInvoke(ar), null);
}
void Process()
{
for (int i = 0; i < this.items.Count; i++)
{
this.ProcessItem(this.items[i]);
}
}
}
が通知コールバックの周りに点在いくつかの余分なコードがあるが、それは主に、それの要旨です。
新しいアイテムをいつでもこのコレクションに追加することができます。これらの新しいアイテムが処理されていることを確認する必要があります。新しいアイテムの通知は、アイテムがコレクションに既に追加された後に発生するイベントによって提供されます。 。このイベントのイベントhanlderで、私はに必要なもしながら、非同期コレクション内の新しいアイテムの処理を再開:私は同じ項目を処理していないことを確認
- 二回
- その項目を確保正しい順序私もスレッドプールを使用する代わりに、専用のスレッドを使用してこれを達成したいブロックされたバックグラウンドタスク
がたくさん並ん回避
this.items
へのアクセスがスレッドセーフであることは明らかです。
同期化されたキューを使用して、処理が開始されたらオブジェクトをリストに移動できませんか? –
Lloyd
@Lloydコレクションへのアクセスはすでにスレッドセーフです。私の質問は、非同期的に 'Process' – Justin