2009-08-27 6 views
0

Я использую log4net в классе с несколькими потоками, и у меня был простой вопрос. Нужно ли вводить readlock/writelock при проверке свойств и методов вызова в интерфейсе log4net.ILog?Общий интерфейс и ReaderWriterLockSlim

Я использую предложенный метод из примеров Log4Net так наверху упомянутого класса у меня есть:

Private Shared ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(decType) 

И поскольку класс включает в себя несколько потоков, взаимодействующих с ним, у меня есть ReaderWriterLockSlim экземпляр, который я использую чтобы я не попадал в какие-либо условия гонки с моими переменными. Таким образом, чтобы резюмировать, если я хочу, чтобы убедиться, что я практикующий безопасный многопоточность мне нужно сделать что-то вроде этого:

If Me.ReaderWriterLockSlim.TryEnterUpgradableReadLock(-1) Then 
    If log.IsWarnEnabled Then 
    If Me.ReaderWriterLockSlim.TryEnterWriteLock(-1) Then 
     log.Warn("Log Message Here") 
     Me.ReaderWriterLockSlim.ExitWriteLock() 
    End If 
    End If 
    Me.ReaderWriterLockSlim.ExitUpgradeableReadLock() 
End If 

Или, я могу просто сделать это:

If log.IsWarnEnabled Then log.Warn("Log Message Here") 

P.S. Да, это грубый псевдокод, у меня на самом деле нет экземпляра ReaderWriterLockSlim, который называется «ReaderWriterLockSlim».

+0

Спасибо за редактирование Стивен, я делал много работы в последнее время. О, и потому что я не могу сопротивляться: «Судо сделать [steven] sandwhich». –

ответ

3

Итак, вы в основном хотите знать, является ли log4net потокобезопасным?

От FAQ:

Да, log4net потокобезопасно.

Таким образом, вы можете просто сделать это:

If log.IsWarnEnabled Then log.Warn("Log Message Here") 
+0

Я хотел удостовериться, что он по-прежнему является потокобезопасным даже при использовании его как общего объекта в многопоточном классе. Я прочитал это с веб-страницы, но так как мне нужно было использовать его, мне казалось, что это край, я хотел бы убедиться, что я все еще остаюсь (потоком) в безопасности. –

+0

Определение «потокобезопасность» (применительно к классам/методам .NET) «безопасно использовать одновременно из нескольких потоков». Часть о том, что это общий объект, не имеет значения. –

+0

Если что-то называется «потокобезопасным», это означает, что отдельные методы могут быть вызваны на общий объект в многопоточном классе без дополнительного кода синхронизации. Конечно, если возвращаемое значение 'IsWarnEnabled 'изменяется между' If' и 'Then', ваш пример может вызвать нежелательные сообщения журнала. – dtb

1

В вашем примере выше, вам не нужно вводить блокировку записи, как вы не изменяя значение IsWarnEnabled. Кроме того, нет никакого смысла в вызове TryEnterWriteLock с бесконечным таймаутом - вы можете также вызвать ReaderWriterLockSlim.EnterWriteLock. Таким образом, даже если Log4Net не потокобезопасной (который, как уже упоминалось, это), вам просто нужно будет написать:

readerWriterLock.EnterReadLock(); 
try 
{ 
    if(log.IsWarnEnabled) 
    log.Warn("log message here"); 
} 
finally 
{ 
    readerWriterLock.ExitReadLock(); 
} 

Вы бы затем ввести блокировку записи при изменении значения лога. IsWarnEnabled.

+0

Точка в шаблоне. Следуя этому шаблону, я могу легко реализовать значение тайм-аута (кроме -1) без повторного факторинга. –

+0

Несомненно, я просто хотел прояснить это для всех, кто придет сюда и скопирует и вставляет ваш код :-) – zcrar70

+0

Имеет смысл, очень ценит Ник! –

Смежные вопросы