我在c#中有一个List(在Unity中),我从这个列表中读取了一些数据,如果有我想要的数据的对象不在列表中,我创建对象并保存它。
如果两个字符想要相同的对象,第一个字符在列表中找不到它,所以它将它保存在列表中,但就在它之前,第二个字符在列表中查找,没有找到对象,并再次保存对象:相同的对象将被保存两次。我们怎么能阻止这个?
答案 0 :(得分:2)
lock (list)
{
if (!FindObject(list))
{
MyClass obj = CreateObject();
list.Add(obj)
}
}
此代码确保搜索列表并向其添加新元素是一个原子操作。其他线程必须等待此操作完成才能开始搜索。
答案 1 :(得分:1)
使用 lock 语句是可能的解决方案之一。以下是如何执行此操作的示例:
private readonly object _lock = new object();
lock (_lock)
{
if(!list.Contains(obj))
list.Add(obj);
}
请注意,我使用了带有 lock 关键字的私有对象。
您还可以考虑使用 System.Collections.Concurrent 命名空间。它可能并不明显,但 ConcurrentDictionary 支持您的方案。方法 TryAdd 只有在字典中不存在元素时才会添加元素。当然,字典与列表不同,但也许适合你。