问题标签 [threadstatic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ASP.NET 中的 ThreadStaticAttribute
我有一个组件需要为static
每个线程存储值。它是一个通用组件,可以在许多场景中使用,而不仅仅是在 ASP.NET 中。
我正在考虑使用该[ThreadStatic]
属性来实现我的目标。假设它在 ASP.NET 场景中也可以正常工作,因为我假设每个请求都在自己的线程中调用。
经过一些研究,我发现Scott Hanselman 的这篇博客文章[ThreadStatic]
说在 ASP.NET 中使用时要小心。
然而,大多数评论(在帖子下方)不同意 Scott 所写的观点,称请求始终在一个线程中运行,并且该线程不会同时被另一个请求使用。这也是我所相信的,但很想在这里对你们的专家发表一些意见。
.net - 使用 ThreadStatic 替换昂贵的本地人——好主意吗?
更新:正如我所料,社区对这个问题的合理建议是“衡量并观察”。chibacity 发布了一个答案,其中包含一些非常好的测试,这些测试为我做了这个;同时,我自己写了一个测试;我看到的性能差异实际上是如此巨大,以至于我不得不写一篇关于它的博客文章。
但是,我也应该承认Hans 的解释,即该ThreadStatic
属性确实不是免费的,实际上依赖于 CLR 辅助方法来发挥其魔力。这使得它是否是适用于任何情况的适当优化远非显而易见。
对我来说,好消息是,就我而言,它似乎取得了很大的进步。
我有一个方法(在许多其他事情中)为一些局部变量实例化一些中等大小的数组(~50 个元素)。
经过一些分析后,我发现这种方法是一种性能瓶颈。并不是该方法需要很长时间才能调用;相反,它只是被调用了很多次,非常快(在一个会话中数十万到数百万次,这将是几个小时)。因此,即使对其性能进行相对较小的改进也应该是值得的。
我突然想到,也许不是在每次调用时分配一个新数组,我可以使用标记的字段[ThreadStatic]
;每当调用该方法时,它将检查该字段是否在当前线程上初始化,如果没有,则对其进行初始化。从那时起,同一线程上的所有调用都将有一个数组准备就绪。
(该方法初始化数组本身中的每个元素,因此数组中的“陈旧”元素应该不是问题。)
我的问题很简单:这看起来是个好主意吗?ThreadStatic
以这种方式使用属性是否存在我应该知道的陷阱(即,作为一种性能优化来减轻为局部变量实例化新对象的成本)?是不是一个ThreadStatic
领域本身的表现可能不是很好;例如,是否有很多额外的“东西”在后台发生,有自己的一套成本,使这个功能成为可能?
对我来说,我什至尝试优化像 50 元素数组这样便宜(?)的东西也是错误的——如果是这样,一定要让我知道——但一般问题仍然存在。
asp.net - 在 asp.net 中使用 threadstatic 的库
我创建了一个库,它使用线程静态变量供同一库的各个类使用。一旦为线程初始化,所有这些类一起工作以使用这些变量完成任务。
现在我需要在 ASP.NET 应用程序中使用同一个库,并且我知道 threadstatic 不会使我的变量对单个线程全局,但这些将在线程之间共享。
我避免将变量传递给函数,因为这听起来不是很好的方法。所以我需要一个解决方案来使我的库可用于两种类型的应用程序(winforms + webforms),即线程静态和会话的替代方案。
使用图书馆中的字典实现我自己的管理怎么样?知道谁给我打电话(库),即桌面应用程序或 asp.net,然后分别使用线程 ID 或会话 ID 从字典中获取变量。现在,我不知道这是否可能。
如果为这个库创建一个 web 服务,它将由 exe 而不是 IIS 托管,以避免 ASP.NET 的线程共享导致 threadstatic 故障?
请提出解决方案。
c# - ThreadStatic 属性如何工作?
[ThreadStatic]
属性如何工作?我假设编译器会发出一些 IL 来填充/检索 TLS 中的值,但是查看反汇编似乎并没有在该级别执行此操作。
作为后续,如果你把它放在一个非静态成员上会发生什么?我们让开发人员犯了这个错误,编译器甚至没有提供警告。
更新
第二个问题在这里回答:ThreadStatic Modified with Static C#
.net - 这个问题的可行解决方案?
我通过多层第 3 方代码从我的一段代码调用,并且调用在某个时候通过调用我编写的一些代码返回到我的代码中。
换句话说,代码调用链如下所示:
不幸的是,我传递给第 3 方的任何代码都没有提供给第二段代码,所以我没有任何东西可以将第一段和第二段联系在一起,除了代码在同一个线程上运行的事实。
所以我想知道如果简单地[ThreadStatic]
在一个类的静态字段上使用会是一个可行的解决方案吗?
由于代码也在 Web 应用程序中运行,因此我不能只为此使用静态字段,因为每个用户/会话我需要访问的值(对象)是不同的。
IE。我会做这样的事情:
还有其他解决方案吗?
.net - 有没有办法模仿 ThreadStatic 与 HttpContext.Current.Items 一起使用?
由于ASP.Net中的线ThreadStatic
程敏捷性,它不适合在 Web 应用程序中用于将静态属性访问从一个请求隔离到下一个请求。
为了避免大量调用HttpContext.Current.Items
和相关的空检查等,.Net 框架是否提供了任何技巧,我可以创建一个类似的属性ThreadStatic
,但HttpContext.Current.Items
如果当前代码在一个ASP.Net 请求上下文?
注意:我知道 ThreadStaticAttribute 是一种特殊情况,内部没有功能代码,并且在其任何魔法发挥作用之前由 JIT 编译器检查。
c# - .NET:ThreadStatic 与 lock { }。为什么 ThreadStaticAttribute 会降低性能?
我编写了小型测试程序,并且很惊讶为什么lock {}
解决方案的执行速度比无锁更快,但[ThreadStatic]
属性优于静态变量。
[ThreadStatic] 片段:
锁定 {} 片段:
在我的机器上,第一个片段需要 4.2 秒;秒 - 3.2 秒,快 1 秒。没有 ThreadStatic 和锁定 - 1.2 秒。
我很好奇为什么[ThreadStatic]
这个简单示例中的属性会增加程序执行时间?
更新:我感到非常抱歉,但这些结果是用于DEBUG
构建的。一方面RELEASE
,我得到了完全不同的数字:(1.2;2.4;1.2)。数字为DEBUG
(4.2; 3.2; 1.2)。
因此,对于RELEASE
构建似乎没有[ThreadStatic]
性能损失。
asp.net - ASP.NET 和 ThreadStatic 作为 TransactionScope 实现的一部分
我想知道 TransactionScope 类如何工作以保持不同方法调用之间的事务(无需将其作为参数传递),我产生了这个疑问。关于这个问题,我有两个考虑:
1
通过 Telerik JustDecompile 查看 TransactionScope 的实现,我发现当前事务存储在 System.Transactions.ContextData 类的 ThreadStatic 成员中(代码如下)。
CurrentData 属性由 TransactionScope 的 PushScope() 方法调用,最后一个属性被大多数 TransactionScope 构造函数使用。
好的,我想我已经找到了他们是如何做到的。
2
我已经了解了使用 ThreadStatic 成员在 ASP.NET (http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx) 中存储对象有多糟糕,因为可能会发生 ASP.NET 线程切换,所以这个数据可能会在工作线程中丢失。
所以,看起来 TransactionScope 不应该与 ASP.NET 一起工作,对吧?但就我在我的 Web 应用程序中使用它而言,我不记得我遇到过有关事务数据丢失的任何问题。
我的问题是“TransactionScope 处理 ASP.NET 线程切换的技巧是什么?”。
是不是对 TransactionScope 是如何存储其事务对象进行了粗浅的分析?或者 TransactionScope 类没有与 ASP.NET 一起工作,我可以被认为是一个从未为此感到痛苦的幸运儿?
任何知道 .NET 的“深埋秘密”的人都可以为我解释一下吗?
谢谢
.net - .NET:ExecutionContext.SuppressFlow 是否分离 ThreadStatic 变量?
问题的标题几乎说明了一切。[ThreadStaticAttribute]
如果您使用ExecutionContext.SuppressFlow()
取消安全上下文和身份令牌等的传播,标记为的静态变量会变得混乱吗?
换句话说,线程静态是否包含在上下文项集中?如果是这样,有没有办法指定你想要的上下文的哪些部分(即只有 ThreadStatics 而不是其余部分)。
.net - .NET 4.0:自执行以来,如何在线程之后清理属性为 threadstatic 的对象引用?
我在 ASP.NET 网络表单代码隐藏中有一个静态连接变量。在页面加载事件中,我在不同的线程中执行了几个方法。每个线程都使用此连接对象的线程静态实例。我想要做的是,在页面的 dispose 事件中,一次清除该连接变量的所有静态实例。如果这是不可能的,那么我只需要在每个方法结束时关闭连接,但如果可能的话,我想在一行代码中处理所有这些。