マルチスレッドコンテキストで(スレッドセーフな)静的メソッドを呼び出しますが、返されたエラーメッセージを何らかのリストに追加する必要があります。.NETで<4の単純なスレッドセーフリストオブジェクトが必要です
.NET 4では、ConcurrentDictionaryを使用できます。しかし、3.5でこれを実行する必要がある場合、以下のallMessagesオブジェクトの代替手段は何ですか?
using (var mre = new ManualResetEvent(false))
{
for (int i = 0; i < max1; i++)
{
ThreadPool.QueueUserWorkItem(st =>
{
for (int j = 0; j < max2; j++)
{
string errorMsg;
// Call thread-safe static method
SomeStaticClass.SomeStaticMethod(out errorMsg);
// Need to collect all errorMsg in some kind of threadsafe list
// allMessages.Add(errorMsg);
}
if (Interlocked.Decrement(ref pending) == 0) mre.Set();
});
}
mre.WaitOne();
}
allMessages-オブジェクトは、可能な限りシンプルにすることができます - リストのいずれかの種類がそれを行うだろう、スレッドセーフな方法で文字列を充填することが可能です。
通常のコレクションとロックを使用するのはどうですか? – CodesInChaos
プライベートオブジェクトを使用する場合、thisLock = new Object();ロック(thisLock){allMessages.Add(errorMsg);}、それで十分でしょうか? – Olaf
これが辞書にアクセスする唯一の方法(読み書きの両方)であれば十分です。 – CodesInChaos