【发布时间】:2012-08-31 01:29:05
【问题描述】:
我是一个线程新手,我正在尝试用 C# (.NET 3.5 SP1) 编写一个自定义线程安全的通用列表类。我读过Why are thread safe collections so hard?。在查看了课程的要求后,我认为我只需要安全地添加到列表中并返回列表.该示例几乎显示了我想要的所有内容,只是它缺少 return list 方法,因此我编写了自己的公共方法,如下所示:
更新:根据给出的建议,我已经审查了我的要求,因此将课程简化为如下:
public sealed class ThreadSafeList<T>
{
private readonly IList<T> list = new List<T>();
private readonly object lockable = new object();
public void Add(T t)
{
lock (lockable)
{
list.Add(t);
}
}
public IList<T> GetSnapshot()
{
IList<T> result;
lock (lockable)
{
result = new List<T>(list);
}
return result;
}
}
【问题讨论】:
-
看起来更好。我要做的最后一件事是将 Translate() 返回的列表设为只读。读取列表中的内容应该是一个固有的只读操作...通过允许从 Translate() 返回的列表被添加到,您为添加到它的人打开了一扇门,这可能会造成一些丑陋的不一致。我会改变'返回结果;' '返回结果.AsReadOnly();'
-
好吧,我仍然对您的特定实现有疑问。 ReadOnlyCollection 只是一个包装器......它不会复制您传递给其构造函数的列表,它只是提供对它的只读访问。因此,如果您尝试枚举 Translate() 返回的列表,如果在枚举发生时有人调用 ThreadSafeList.Add(),您可能会遇到异常。我仍然建议显式复制列表并执行 return result.AsReadOnly() 以防止这种情况发生。它使用更多内存,但不会遇到任何线程问题。
-
线程很难,感谢所有贡献的人!
标签: c# list thread-safety generic-list