C# - я использующий блокировку правильно?

Пользователю требовалась лицензия MSDN для использования Visual Studio в дополнение к правильной группе проекта VSTS. Пробная лицензия была недостаточно хороша.

6
задан mafu 6 April 2009 в 12:30
поделиться

3 ответа

То, что Вы отправили, выглядит хорошо от многопоточности perpective. Хотя я мог быть неправым, будет казаться, что любой другой код, который делает некоторую многопоточность (даже использующий объект нечто) должен быть безопасным. Конечно, я не вижу мертвых блокировок в том разделе кода.

Несколько вещей, которые стоит отметить так или иначе (кроме того, чтобы быть очень осторожным с мертвыми блокировками и тестирующий строго для обеспечения, они не произойдут):

  • Лучше помещать блокировку вокруг кода в конструкторе, поскольку я полагаю, что возможно при определенных обстоятельствах, что методы можно назвать, прежде чем блок конструктора закончил выполняться. (Кто-то исправьте меня, если я неправ в этом.)
  • StreamWriter объект в этом случае является частным, который хорош. Если бы это было защищено или внутреннее, то необходимо было бы, конечно, быть осторожны относительно того, как другой код использовал объект (на самом деле, я думаю, что было бы лучше почти всегда объявить такие объекты как частные).
  • Вы сделали блокировку правильного пути! Является всегда самым безопасным соединить отдельный частный объект экземпляра, потому что Вы знаете, что объект не может быть заблокирован никаким другим кодом, чем Ваше собственное (который не имеет место, если Вы блокируете this или StreamWriter сам объект).

Однако, я могу пропускать что-то, и существует маленькая возможность, что некоторый другой код, не показанный выше, мог бы вызвать проблемы, но насколько я вижу его, что код не испорчен за исключением возможной недостающей блокировки вокруг кода конструктора. Вам придется, более вероятно, не упустить ситуации с мертвой блокировкой, когда Вы начнете делать более сложную многопоточность, особенно через классы/экземпляры.

Так или иначе, надежда, которая помогает.

7
ответ дан 8 December 2019 в 13:49
поделиться

Обработчик событий находится на том же потоке как генератор событий, что означает, что Ваше приложение могло закончить тем, что поддержалось Вашей записью файла журнала.

private void Foo_Update(object sender, SomeArgs args)        { 
    ThreadPool.QueueUserWorkItem(WriteAsync, args);
}

private void WriteAsync(object state) {  
    SomeArgs args = (SomeArgs)state;    
    lock (m_WriteLock) {                        
       m_Writer.WriteLine (args);                        
       m_Writer.Flush ();                
   }        
}
1
ответ дан 8 December 2019 в 13:49
поделиться

Ну, это смотрит хорошо мне; я, вероятно, реализовал бы IDisposable как средство для Close() файл, но...

Конечно, Вы могли также использовать любой из (много) предконсервированные платформы журналирования.


Обновление:

Одна мысль: Вы могли бы хотеть рассмотреть то, что происходит, если файл уже существует; Вы не хотите топать на своих журналах...

9
ответ дан 8 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

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