C # TraceSource класс в многопоточном приложении - PullRequest
2 голосов
/ 15 декабря 2009

msdn: «Любые открытые статические (Shared в Visual Basic) члены этого типа являются поточно-ориентированными. Любые члены экземпляров не гарантируют поточно-ориентированные». он содержит только методы экземпляра.

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

(Я как бы задал этот вопрос в , как создать экземпляр Cce TraceSources для регистрации (многопоточного) веб-приложения ASP.NET 2.0 (asmx ws)? , но я не могу просто поверить, если кто-то просто скажет все в порядке, несмотря на документацию).

Ответы [ 2 ]

7 голосов
/ 27 сентября 2010

Класс TraceSource является поточно-ориентированным. Смотри http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.aspx.

Я считаю, что ранее он не был указан как потокобезопасный, но это была ошибка документации.

0 голосов
/ 15 декабря 2009

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

lock( _lockObject)
{
  // do my non-thread-safe-operations here
}

Документация / примеры для ключевого слова блокировки можно найти здесь:

http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.71).aspx

Что касается всех потоков, использующих общий статический экземпляр класса - это не обязательно потокобезопасно. Использование статического экземпляра гарантирует, что состояние объекта является общим / согласованным между потоками, но не обязательно предотвращает параллельные вызовы метода. Фактически, если методы экземпляра используют некоторые общие переменные состояния в статическом объекте - доступ к объекту из нескольких потоков может создать дополнительные проблемы - условия гонки, несколько потоков, пытающихся получить доступ к одному и тому же ресурсу и т. Д. Статический экземпляр объект не мешает этим условиям.

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

...