Потоковые статические переменные для асинхронных операций в.NET
Есть ли способ передать переменные ThreadStatic из одного потока в другой? У меня есть куча переменных ThreadStatic, и теперь, когда я преобразовываю свою операцию в асинхронную, я хочу иметь возможность "перенести" их из первого потока (где они установлены) в поток обратного вызова (где они будут прочитаны). Это возможно?
4 ответа
Нет. Вы должны сохранить контекст операции с асинхронным вызовом. Это то, что параметр "состояния" для большинства асинхронных вызовов.
ThreadStatic
переменные могут быть полезны в некоторых ситуациях, но я, как правило, настороженно отношусь к ним. Если вы действительно не знаете, что вам не нужна какая-либо подвижность потоков, лучше сохранять состояние более четко.
Наилучшим подходом для этого было бы передать вашей операции некоторый объект, который он может установить для вашей потоковой переменной перед обратным вызовом. Нет способа получить прямой доступ к переменной threadstatic из вызывающего потока.
При этом я бы переосмыслил ваш дизайн. Если вы хотите, чтобы переменная была доступна из нескольких потоков, вероятно, она не должна быть потоковой переменной. Вероятно, это должно управляться другими способами.
Если вам нужно сделать это, вы, вероятно, не хотите, чтобы они были ThreadStatic
, Вы могли бы сделать статический Dictionary<int,VarType>
и сопоставить идентификаторы потоков с переменными.
Мне кажется, что лучшим способом было бы использовать параметр состояния, как сказал Джон. Однако при необходимости вы можете посмотреть на System.Runtime.Remoting.Contexts.Context.