Этот код сам по себе не ориентирован на многопотоковое исполнение.
Я не буду делать никаких предложений относительно вашего «дизайна», так как вы его не спрашивали.Я предположу, что вы нашли веские причины для этих статических членов и показали содержание своего списка, как вы это сделали.
Однако, если вы хотите сделать свой код поточно-ориентированным, вам следует в основном использоватьобъект блокировки для блокировки и оберните содержимое ваших методов оператором блокировки:
private readonly object syncObject = new object();
void SomeMethod()
{
lock (this.syncObject)
{
// Work with your list here
}
}
Остерегайтесь того, что вызываемые события могут удерживать блокировку в течение длительного периода времени, в зависимости отчто делают делегаты.Вы можете опустить блокировку из свойства NoOfOnlineUsers, объявив свой список как изменчивый.Тем не менее, если вы хотите, чтобы значение Count сохранялось до тех пор, пока вы используете его в определенный момент, используйте также блокировку там.
Как и другие здесь предлагают, выставляя ваш список напрямую, даже сблокировка, все равно будет представлять «угрозу» для его содержимого.Я бы пошел с возвратом копии (и это должно соответствовать большинству целей), как советовал Марк Гравелл.
Теперь, так как вы сказали, что используете это в среде ASP.NET, стоит сказать, что все локальные ипеременные-члены, а также их переменные-члены, если таковые имеются, являются потокобезопасными.