在.NET框架代码中使用ThreadStatic是过去时代的有害遗物吗?

[ThreadStatic]用于.NET框架中的各个位置,为各种功能提供环境上下文(例如Transaction.Current,用于TransactionScope).

不幸的是,这意味着做一些线程杂耍的功能(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?

最佳答案 实际上,它们具有非常不同的用例.

> ThreadStatic无法跨await或类似的上下文切换传输值.
> CallContext无法保留每个线程的值.

所以你看,一个人无法取代另一个人. ThreadStatic是一个低级原语.在CallContext等出现后,我认为它的用例没有减少.请注意,它的用例非常小 – 我想我上次使用它的时间可能是两年多以前了.

我将Transaction.Current之类的东西描述为滥用TLS.它从来没有为此而设计,所以当TLS似乎打破异步时,它只是因为它首先从来没有用过它.

点赞