[ThreadStatic]
используется в разных местах среды .NET для обеспечения контекста окружающего пространства для различных функций (например, Transaction.Current
, который используется для TransactionScope
).Является ли использование ThreadStatic в коде .NET Framework вредной реликвией временного возраста?
К сожалению, это означает, что функции, которые выполняют некоторые манипуляции с потоком (ASP.NET, код ключа async), переключают потоки, но не копируют TransactionScope
, поэтому такие функции, как TransactionScope
don't work as you might expect.
Существует еще один механизм, CallContext.LogicalGetData
(более here), который корректно копирует состояние во время поточных коммутаторов (по крайней мере, в .NET 4.5). Мне кажется, что TransactionScope
было бы лучше, если бы оно использовало это, а не [ThreadStatic]
.
Если функции, которые используют [ThreadStatic]
, были написаны сегодня, вместо того, чтобы быть существующими функциями с требованиями обратной совместимости, могли бы они быть написаны с использованием CallContext.(G|S)etLogicalData
?
Существует несколько видов операций, которые являются неотъемлемо последовательными, а использование поточно-статического хранилища может быть более чистым, чем необходимость иметь код вне метода, передавая параметры для чего-либо, что может заинтересовать код внутри метода.Связать вещи с потоком может быть проблематично с такими вещами, как асинхронный код; было бы неплохо, если бы структура имела первоклассную поддержку одностороннего метода, посредством которого методы могли передавать дополнительную информацию во вложенные методы, которые они вызывают, без вмешательства слоев, которые должны обрабатывать ее. Асинхронные методы могли бы затем ... – supercat
... получить ссылку на чтение только для среды, в которой они были вызваны; если методы async должны передавать данные в дополнительные вложенные методы, они могут построить новую среду со ссылкой на родителя. – supercat