我們在多線程環境中調用(線程安全)靜態方法,但需要將返回的錯誤消息添加到某種列表。.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