【发布时间】:2011-09-19 10:53:58
【问题描述】:
我们在多线程上下文中调用(线程安全)静态方法,但需要将返回的错误消息添加到某种列表中。
在 .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 对象可以尽可能简单 - 任何能够以线程安全方式填充字符串的列表都可以。
【问题讨论】:
-
使用普通的收集和锁定怎么样?
-
如果我使用任何私有对象 thisLock = new Object();并做 lock(thisLock) {allMessages.Add(errorMsg);},这样就够了吗?
-
如果这是您访问字典的唯一方式(阅读和写作),那么这就足够了。
标签: c# multithreading