Блокировка C# и анализ кода, предупреждающий CA2002

Мне нравится запись через точку намного лучше, чем поля словаря лично. Причина, являющаяся этим, это заставляет автозавершение работать намного лучше.

7
задан RaYell 23 October 2009 в 13:49
поделиться

4 ответа

Неправильно то, что вы блокируете что-то общедоступное ( typeof (SynchronizationForm) ), которое доступно везде из вашего кода, и если какой-то другой поток блокирует то же самое вы попали в тупик. В общем случае рекомендуется блокировать только частные статические объекты:

private static object _syncRoot = new object();
...
lock (_syncRoot) 
{

}

Это гарантирует вам, что только SynchronizationForm может обладать блокировкой.

9
ответ дан 6 December 2019 в 09:20
поделиться

Из объяснения правила MSDN

Говорят, что объект имеет слабую идентичность, если к нему можно получить прямой доступ через границы домена приложения. Поток, который пытается получить блокировку объекта со слабой идентификацией, может быть заблокирован вторым потоком в другом домене приложения, у которого есть блокировка того же объекта.

Поскольку вы не всегда можете предсказать, что блокирует другой объект. AppDomain может занять, и поскольку такие блокировки могут потребовать упорядочивания и тогда они будут дорогостоящими, это правило имеет для меня смысл.

6
ответ дан 6 December 2019 в 09:20
поделиться

Проблема в том, что typeof (SynchronizationForm) не является закрытым объектом блокировки, а это означает, что любой другой фрагмент кода может использовать его для блокировки, что может привести к тупиковой ситуации. Например, если какой-то другой код сделал это:

var form = new SynchronizationForm();
lock(typeof(SynchronizationForm))
{
    form.SomeMethodThatCausesSynchronizationForm_ShownToBeCalled();
}

Тогда возникнет взаимоблокировка. Вместо этого вам следует удалить объект частной блокировки в классе SynchronizationForm и вместо этого заблокировать его.

3
ответ дан 6 December 2019 в 09:20
поделиться

Объект System.Type класса можно удобно использовать в качестве блокировки взаимного исключения для статических методов класса.

Источник: http : //msdn.microsoft.com/en-us/library/aa664735 (VS.71) .aspx

Чтобы добавить к ответу Дуга, у вас есть механизм блокировки, который следует использовать только в статических методах, поскольку используется в методе экземпляра.

2
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: