Мне нравится запись через точку намного лучше, чем поля словаря лично. Причина, являющаяся этим, это заставляет автозавершение работать намного лучше.
Неправильно то, что вы блокируете что-то общедоступное ( typeof (SynchronizationForm)
), которое доступно везде из вашего кода, и если какой-то другой поток блокирует то же самое вы попали в тупик. В общем случае рекомендуется блокировать только частные статические объекты:
private static object _syncRoot = new object();
...
lock (_syncRoot)
{
}
Это гарантирует вам, что только SynchronizationForm
может обладать блокировкой.
Говорят, что объект имеет слабую идентичность, если к нему можно получить прямой доступ через границы домена приложения. Поток, который пытается получить блокировку объекта со слабой идентификацией, может быть заблокирован вторым потоком в другом домене приложения, у которого есть блокировка того же объекта.
Поскольку вы не всегда можете предсказать, что блокирует другой объект. AppDomain может занять, и поскольку такие блокировки могут потребовать упорядочивания и тогда они будут дорогостоящими, это правило имеет для меня смысл.
Проблема в том, что typeof (SynchronizationForm) не является закрытым объектом блокировки, а это означает, что любой другой фрагмент кода может использовать его для блокировки, что может привести к тупиковой ситуации. Например, если какой-то другой код сделал это:
var form = new SynchronizationForm();
lock(typeof(SynchronizationForm))
{
form.SomeMethodThatCausesSynchronizationForm_ShownToBeCalled();
}
Тогда возникнет взаимоблокировка. Вместо этого вам следует удалить объект частной блокировки в классе SynchronizationForm и вместо этого заблокировать его.
Объект
System.Type
класса можно удобно использовать в качестве блокировки взаимного исключения для статических методов класса.
Источник: http : //msdn.microsoft.com/en-us/library/aa664735 (VS.71) .aspx
Чтобы добавить к ответу Дуга, у вас есть механизм блокировки, который следует использовать только в статических методах, поскольку используется в методе экземпляра.