Статический словарь в безопасности .Net Thread - PullRequest
1 голос
/ 30 апреля 2009

Чтение msdn документации для словарей гласит: "Открытые статические (Shared в Visual Basic) члены этого типа являются поточно-ориентированными. Любые члены экземпляра не гарантированно являются потоко-безопасными."

Это означает, что со словарем, подобным этому:


static object syncObject = new object();
static Dictionary<string,MyObject> mydictionary= new Dictionary<string, MyObject>();

Делать что-то вроде приведенного ниже кода не нужно?


lock (syncObject)
{
   context = new TDataContext();
   mydictionary.Add("key", myObject);
}

Ответы [ 3 ]

7 голосов
/ 30 апреля 2009

Это относится к статическим методам самого класса. Утверждение фактически является стандартной документацией, добавленной к большинству классов. Класс Dictionary <> фактически не предоставляет никаких статических методов.

Вам придется самостоятельно сериализовать доступ к вашему словарному классу, используя ключевое слово lock или, возможно, даже ReaderWriterLock. Тем не менее, многопоточность - довольно сложная тема, и ключевое слово lock не всегда подходит. Есть замечательная книга Джо Даффи " Параллельное программирование в Windows ", в которой подробно рассказывается о защите общих ресурсов приложений.

2 голосов
/ 30 апреля 2009

Вы неправильно интерпретируете «общедоступные статические члены этого типа» как «общедоступные статические экземпляры этого типа».

1 голос
/ 30 апреля 2009

Это означает, что если вы вызываете метод Add (метод экземпляра), вам лучше обеспечить эксклюзивный доступ к Словарю, используя собственную семантику блокировки или сериализации. Плохие вещи могут произойти, если два потока изменяют состояние вашего словаря одновременно, и вы несете ответственность за то, чтобы этого не произошло. В методе Add словаря нет ничего, что могло бы сделать эту блокировку за вас.

Если, однако, вы вызываете какой-то статический метод в словаре (из которых нет никаких полезных), то без блокировки все будет в порядке.

Это общее правило для всех типов .NET в BCL.

...