Как сделать приватное статическое поле потока статического класса безопасным? - PullRequest
0 голосов
/ 21 декабря 2010

У меня есть статический класс, который имеет частный словарь.Я написал публичные методы для добавления и удаления объектов к нему.Теперь я хочу убедиться, что когда я удаляю один из элементов из словаря, никто другой не использует его.

Как мне этого добиться?

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

Вы хотите сказать, что хотите, чтобы никто другой не использовал словарь , или никто другой не использовал значение, которое было в словаре?

Вы можете решить первое с помощью блокировки ... но вы не можете сделать второе.Кто-то может получить ссылку на объект из словаря и сохранить эту ссылку так долго, как пожелает. может быть решением, если значение является типом интерфейса - вы можете делегировать все вызовы через дополнительный класс «обертки» и лишить законной силы этот класс обертки.Я могу вдаваться в подробности, если хотите, но я надеюсь вы действительно просто заинтересованы в первом типе безопасности:)

Этого можно достичь следующим образом:

private static readonly object mutex = new object();

// Or whatever
private static readonly Dictionary<string, string> map =
    new Dictionary<string, string>();

public static void AddEntry(string key, string value)
{
    lock (mutex)
    {
        map[key] = value;
    }
}

public static string GetValue(string key, string value)
{
    lock (mutex)
    {
        return map[key];
    }
}

Очевидно, вы захотите настроить способ использования словаря.

Если вы используете .NET 4, другой альтернативой будет использование ConcurrentDictionary, который уже поточно-ориентирован.

1 голос
/ 21 декабря 2010

Обратите внимание на использование оператора блокировки (C # Reference)

...