У меня есть HTTP-сервер, который я пишу, используя HTTP-прослушиватель, и я хотел бы как-то объявить определенные переменные доступными из любого места в потоке.
- Мой класс webserver основан на базе instanced, поэтому я не могу использовать статическую переменную.
- Я мог бы использовать переменную экземпляра, поскольку весь код находится в одном классе, но... я не знаю.
Я думал о использовании словаря: Dictionary</*[type of Thread ID here]*/,ThreadData>
, но я думаю, что могут возникнуть проблемы с потоками. ThreadData
, вероятно, будет экземпляром класса, но я мог бы использовать struct, в зависимости от того, что было бы более эффективным.
- Если бы я ввел словарь в ИД потоков и запрограммировал его так, чтобы один поток запрашивал только свою собственную запись в словаре, были ли какие-либо связанные с потоком проблемы при доступе к словарю?
- Каждый поток добавит свою собственную запись. Должен ли я заблокировать словарь, пока я добавляю новые элементы потока? Если да, смогу ли я использовать отдельный объект блокировки, чтобы позволить потокам получать доступ к своим собственным данным за это время?
Будет ли преимущество использования параллельного словаря? Есть ли другой способ, который более безопасен для потоков?
В настоящее время я использую ThreadPool.QueueUserWorkItem
. Я точно не знаю, что для каждого элемента используется новый поток. Если нет, то я мог бы также указать его в контексте.
Обновление: Согласно ThreadPool class - MSDN, он повторно использует потоки. И он не очищает данные потоков.
Когда пул потоков повторно использует поток, он не очищает данные в локальном хранилище потоков или в полях, отмеченных атрибутом ThreadStaticAttribute. Поэтому, когда метод проверяет локальное хранилище потоков или поля, помеченные атрибутом ThreadStaticAttribute, найденные значения могут быть оставлены из более раннего использования потока потока потока.