При использовании ресурса, который не является поточно-ориентированным (или не гарантированно поточно-ориентированным) в многопоточном приложении, я буду использовать ключевое слово lock
lock( _lockObject)
{
// do my non-thread-safe-operations here
}
Документация / примеры для ключевого слова блокировки можно найти здесь:
http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.71).aspx
Что касается всех потоков, использующих общий статический экземпляр класса - это не обязательно потокобезопасно. Использование статического экземпляра гарантирует, что состояние объекта является общим / согласованным между потоками, но не обязательно предотвращает параллельные вызовы метода. Фактически, если методы экземпляра используют некоторые общие переменные состояния в статическом объекте - доступ к объекту из нескольких потоков может создать дополнительные проблемы - условия гонки, несколько потоков, пытающихся получить доступ к одному и тому же ресурсу и т. Д. Статический экземпляр объект не мешает этим условиям.
Если вы используете статический экземпляр объекта, установите замок вокруг него, когда вы работаете с ним, и все должно быть в порядке.