2009-06-02 2 views
1

У меня есть пользовательская CMS, в которой я использую статический XElement в качестве карты сайта. Когда обновления происходят с картой, я синхронизую потоки записи, но ничего не делаю с читателями, просто позволяя им захватить XElement, когда они в ней нуждаются.Общий XElement как SiteMap

При тестировании я думал, что если бы я перечислил XElement из потока читателя, а я обновил его на другом потоке писем, я получил бы исключение. Это было не так. Просто интересно, может ли кто-нибудь объяснить мне, видят ли они какие-либо серьезные проблемы с этим подходом. Не похоже, что это должно быть безопасно, но все мое тестирование пока показывает, что это так.

ответ

0

Используйте System.Threading.ReaderWriterLock для управления доступом к XElement. Таким образом, вы синхронизируете всех читателей и любых авторов, не блокируя одновременную активность чтения.

+0

Должно ли запирание выполняться на самом XElement или на общем статическом объекте? – user115963

+0

В этом случае вы не будете использовать функцию блокировки (которая, как мне кажется, использует класс Monitor). Вы бы создали статический экземпляр ReaderWriterLock, который был бы вашим «заблокированным» объектом, который вы затем вызываете по методам AquireReaderLock или AcquireWriterLock по мере необходимости. Обратите внимание, что вы несете ответственность за то, что вы вызываете соответствующий метод Release даже в условиях ошибки. Следовательно, вам нужно убедиться, что вы ввели блок Try после приобретения блокировки и включили соответствующий вызов Release в блоке finally. – AnthonyWJones