2015-07-29 4 views
0

Постараюсь изо всех сил объяснить ситуацию.Настройка свойств объекта по нескольким потокам

public class A 
{ 
    Int64 Id { get; set; } 
    Decimal Foo { get; set; } 
} 

public class B 
{ 
    Int64 Id { get; set; } 
    Decimal Bar { get; set; } 
} 

public class C 
{ 
    Int64 Id { get; set; } 
    Decimal? Foo { get; set; } 
    Decimal? Bar { get; set; } 
} 

public class test 
{ 
    ConcurrentDictionary<Int64, C> dictionary { get; set; } 
    List<A> listA { get; set; } 
    List<B> listB { get; set; } 
} 

listA и listB каждый содержит 5 миллионов объектов.

Так что я делаю, я прохожу через listA и listB в отдельных потоках. Я проверяю, содержит ли словарь идентификатор, затем получите значение и задайте свойство соответствия.

Так что мой вопрос в том, что это потоки? Если нет, то что было бы лучшим способом сделать это потокобезопасны

еще одна вещь:

  • Там нет дубликатов в lišta и LISTB. Поэтому я только однажды установил свойство любого объекта C.

Пример использования фиктивного данных:

List<A> listA = new List<A> 
{ 
    new A { Id = 1, Foo = 5 }, 
    new A { Id = 2, Foo = 10 }, 
    new A { Id = 3, Foo = 100 } 
}; 

List<B> listB = new List<B> 
{ 
    new A { Id = 1, Bar = 3 }, 
    new A { Id = 2, Bar = 2 }, 
    new A { Id = 3, Bar = 1 } 
}; 

ConcurrentDictionary<Int64, C> dictionary = new ConcurrentDictionary<Int64, C> 
{ 
    Keys = {1, 2, 3}, 
    Values = { new C { Id = 1 }, new C { Id = 2 }, new C { Id = 3 } } 
}; 

Потом я словарь будет иметь эти пары ключ/значение:

Key = 1 , value = object of class C with properties : Id = 1, Foo = 5, Bar = 3, 
Key = 1 , value = object of class C with properties : Id = 1, Foo = 10, Bar = 2, 
Key = 1 , value = object of class C with properties : Id = 1, Foo = 100, Bar = 1  

ответ

0

Если все, что вы делаете в ваших петель доступа объекта Кассиопеяне которые уже находятся в параллельном словаре и устанавливают свойства Foo и Bar соответственно, тогда да, это должно быть потокобезопасным.

Если вы вставляете или удаляете элементы из ConcurrentDictionary, это также должно быть потокобезопасным при условии, что вы используете ConcurrentDictionary соответствующим образом.

0

ConcurrentDictionary является потокобезопасным.

https://msdn.microsoft.com/en-us/library/dd287191(v=vs.110).aspx Представляет собой потокобезопасную коллекцию пар ключ/значение, к которой можно одновременно обращаться несколькими потоками.

Таким образом, вы должны иметь доступ к нему из любого количества потоков, которые вы хотите. НО есть улов

Допустим, что ваш словарь пуст, оба потока проверить, если объект с целевой ID существует, а затем продолжить, чтобы добавить новый, если нет, то может случиться так, что оба потока попробуйте добавить тот же новый элемент. Таким образом, ваш словарь должен содержать объекты уже или вам придется использовать блокировки.

Смежные вопросы