问题标签 [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.

0 投票
2 回答
1137 浏览

.net - VB.NET 4.0:对于我的 TdConnection 属性,ThreadStatic 似乎不是线程安全的

这是我的代码:

它位于 ASP.NET Web 应用程序的一个模块中,因此所有成员根据定义都是共享/静态的。我的目标本质上是懒惰。我在任何地方都使用连接,因此拥有一个线程静态属性是有意义的,这样它就可以作为每个线程的一个新实例,而不是每次我想使用它时都会使新的连接对象变暗。

这似乎一直有效,直到我决定在两个不同的浏览器中加载相同的页面。当我这样做时,会抛出一个异常,指出连接对象已在使用中。

我在 Microsoft 文章中读到,不能保证实例类型是线程安全的。如果是这种情况,我该怎么做才能确保此属性及其字段是线程安全的?

编辑:令人困惑的是此代码在页面加载事件中起作用:

这些 .LoadData() 方法中的每一个都在一个单独的线程中执行,并且它们都引用了我上面的 GlobalConnection 属性。我最初在没有 ThreadStatic 属性的情况下编写了所有这些内容。遇到错误后,我创建了 GlobalConnection 属性 ThreadStatic,问题就消失了。当它投入生产时,这个网络应用程序将被多人使用。这就是促使我在两个 Web 浏览器中打开同一页面的原因。我认为那将是两个单独的线程,但也许我错了。

0 投票
2 回答
2169 浏览

c# - 为什么 ThreadStatic 数据在线程之间意外共享?

我有一个我编写的日志框架,它能够跟踪“日志上下文”。它有一个可插拔的策略框架,但是我最常使用的是一个 ThreadStatic 变体,它在变量中跟踪上下文[ThreadStatic]。我一直在尝试解决多线程工作流中记录上下文的问题。目标是让共享一个公共线程的所有方法和类的所有调用的所有日志条目记录相同的上下文信息。由于理论上每个线程都应该获得自己的 ThreadStatic 变量,因此这个想法似乎很简单。

实际上,似乎 ThreadStatic 数据实际上是跨线程共享的。这违背了我对线程的理解。我很难弄清楚问题出在哪里,直到我输入了一个额外的日志条目,该条目跟踪每个线程何时清除线程上下文(所有线程都在主循环上运行......在开始时,如果必要的消息是接收到,上下文被初始化,最后在 finally 子句中,它的重置。)以下日志记录是一致的:

[2011-12-15 16:27:21,233] [调试] [TPI.LTI.Eventing.GroupCreatedNotificationHandler: TPI.LTI.Provisioning.Handlers.GroupCreatedNotificationHandler.WORKDEVELOPMENT.1_Thread: 324]: (ContextId=184e82dd-152b-4bb5- a2c6-3e05b2365c04;TransactionId=1a11130e-e8dd-4fa1-9107-3b46dcb4ffd6;HandlerName=GroupCreatedNotificationHandler;HandlerId=WORKDEVELOPMENT.1)将工具“0967e031-398f-437d-8949-2a17fe844df0”的事件推送到 http://tpisondev。 com/tpi/lti/服务/事件...

[2011-12-15 16:27:21,259] [调试] [TPI.LTI.Facades.LTIFacade: TPI.LTI.Provisioning.Handlers.GroupCreatedNotificationHandler.WORKDEVELOPMENT.1_Thread: 299]: (ContextId=184e82dd-152b-4bb5- a2c6-3e05b2365c04; TransactionId=1a11130e-e8dd-4fa1-9107-3b46dcb4ffd6; HandlerName=GroupCreatedNotificationHandler; HandlerId=WORKDEVELOPMENT.1)获取工具实例 guid 0967e031-398f-437d-8949-2a17fe844df0 的 LTI 工具实例:

[2011-12-15 16:27:21,318] [调试] [TPI.LTI.Facades.LTIFacade: TPI.LTI.Provisioning.Handlers.GroupCreatedNotificationHandler.WORKDEVELOPMENT.1_Thread: 299]: (ContextId=184e82dd-152b-4bb5- a2c6-3e05b2365c04;TransactionId=1a11130e-e8dd-4fa1-9107-3b46dcb4ffd6;HandlerName=GroupCreatedNotificationHandler;HandlerId=WORKDEVELOPMENT.1)找到工具实例 guid 0967e031-398f-437d-8949-2a17fe844df 的 LTI 工具实例。

[2011-12-15 16:27:21,352] [调试] [TPI.LTI.Facades.TPIFacade: TPI.LTI.Provisioning.Handlers.GroupCreatedNotificationHandler.WORKDEVELOPMENT.1_Thread: 299]: (ContextId=184e82dd-152b-4bb5- a2c6-3e05b2365c04;TransactionId=1a11130e-e8dd-4fa1-9107-3b46dcb4ffd6;HandlerName=GroupCreatedNotificationHandler;HandlerId=WORKDEVELOPMENT.1)在“http://tpidev.pearsoncmg.com/tpi/lti/service/event”向 TPI 发布事件...

[2011-12-15 16:27:21,428] [DEBUG] [TPI.LTI.Eventing.GroupCreatedNotificationHandler: TPI.LTI.Provisioning.Handlers.GroupCreatedNotificationHandler.WORKDEVELOPMENT.2_Thread: 301]: [LOG] 重置日志记录上下文!!

[2011-12-15 16:27:21,442] [DEBUG] [TPI.LTI.Eventing.GroupCreatedNotificationHandler:TPI.LTI.Provisioning.Handlers.GroupCreatedNotificationHandler.WORKDEVELOPMENT.2_Thread:299]:队列中没有待处理的消息。GroupCreatedNotificationHandler.WORKDEVELOPMENT.2 处理程序正在等待...

[2011-12-15 16:27:22,282] [DEBUG] [TPI.LTI.Facades.TPIFacade: TPI.LTI.Provisioning.Handlers.GroupCreatedNotificationHandler.WORKDEVELOPMENT.1_Thread: 301]:事件发布到 TPI。

[2011-12-15 16:27:22,283] [DEBUG] [TPI.LTI.Eventing.GroupCreatedNotificationHandler:TPI.LTI.Provisioning.Handlers.GroupCreatedNotificationHandler.WORKDEVELOPMENT.1_Thread:301]:收到来自提供商的回复:

您可以看到在这种特殊情况下有两个线程,1_Thread 和 2_Thread。我用斜体表示应该包含在 1_Thread 的每个日志条目开头的上下文数据。我在 2_Thread 中将日志上下文重置的位置加粗。在那之后,1_Thread 的所有上下文信息都丢失了。到目前为止,在几十个测试中,所有线程的上下文信息在另一个日志上下文被重置后都会丢失。

我误解了ThreadStatic吗?自 2001 年以来,我一直在编写 C# 代码,而我以前从未经历过这种行为。.NET 4 中似乎有一个新ThreadLocal<T>类,但是我不确定它是否只是在内部使用了 ThreadStatic,因此会出现同样的问题,或者它的功能是否不同(希望更可靠。)对此问题的任何见解将不胜感激!谢谢!

0 投票
1 回答
1717 浏览

asp.net-mvc-3 - asp.net mvc3 请求线程亲和性

我在我的 asp.net mvc3 应用程序(在 IIS7 上)中使用了专有的 IoC 机制,该机制将状态保存在 [ThreadStatic] 字段中,因此依赖于 HttpApplication.BeginRequest、HttpApplication.EndRequest 和整个同步执行的假设(单)它们相关的请求在同一个线程上执行。

这个假设正确吗?

0 投票
2 回答
2087 浏览

c# - C# ThreadStatic + volatile 成员未按预期工作

我正在阅读提示和技巧帖子,我想我会尝试一些我以前从未做过的 C# 东西。因此,下面的代码没有实际用途,只是一个“测试功能”,看看会发生什么。

无论如何,我有两个静态私有字段:

如您所见,我正在测试ThreadStaticAttributevolatile关键字。

无论如何,我有一个看起来像这样的测试方法:

我希望看到从这个函数返回的是这样的输出:

但是,我得到的是:

输出的后半部分与预期的一样(我想这意味着 ThreadStatic 字段的工作方式与我想的一样),但似乎一些初始输出已从前半部分“跳过”。

此外,前“半”中的线程乱序,但我知道线程不会在您调用 Start() 后立即运行;但相反,内部操作系统控件将按照它认为合适的方式启动线程。 编辑:不,他们不是,实际上,我只是认为他们是因为我的大脑错过了连续的数字


所以,我的问题是:导致我在输出的前“一半”中丢失几行的问题是什么?例如,' thread 3 setting threadInt to 84 '这一行在哪里?

0 投票
1 回答
101 浏览

c# - 从 ThreadStaticAttribute 派生子类的原因是什么?

今天早上我在 C# 上刷新了我的记忆ThreadStaticAttribute,下面这行突然出现在我身上:

照原样使用此属性,不要从它派生。

此行存在于所有版本的 .Net Framework 的文档中,并且 Microsoft 自己对该问题的代码分析指出,只有当属性被设计为属性层次结构的一部分时,它们才应保持未密封状态。

所以 -ThreadStaticAttribute现在没有,而且似乎从来没有sealed。为什么?

0 投票
3 回答
1399 浏览

asp.net - 当 ConcurrencyMode = Multiple 时,两个并行 WCF 请求是否可以由同一个线程处理

我有一个带有 ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Multiple)的 WCF 服务。我想使用 ThreadStatic 变量来获取数据。

我开始担心是否有可能对相同或不同 operationContracts 的两个并行请求由同一个线程服务器端处理,因为如果发生这种情况,我的 ThreadStatic 变量将被覆盖。(即类似于 ASP.NET 中 HttpHandlers 和 HttpModules 之间的线程更改)

我用相同的 ServiceBehaviour 和 maxConcurrentCalls="2" 做了一个尖峰服务。之后,一个 wcf 客户端用 50 个并行请求调用了该服务,而我的担心并没有发生。然而,这并不是 100% 的证明。

预先感谢!

0 投票
4 回答
1658 浏览

wcf - ThreadStatic - WCF 方法调用是否仅在单个线程上执行?

我们的 WCF 服务引用的库之一使用 ThreadStatic 变量。服务方法在每次调用开始时设置它的值。我想知道这是否安全——换句话说,我们能否保证只有一个线程专门用于整个调用?或者是否有可能调用可以在一个工作线程上开始并在另一个工作线程上结束?还是可以将工作线程交换到不同的方法调用然后再返回?

我们使用 ConcurrencyMode.Single 和 InstanceContextMode.PerSession 的默认值。

编辑

到目前为止,我能找到的唯一信息是这篇博文,其中指出一个调用可以由多个线程处理:

http://blogs.microsoft.co.il/blogs/applisec/archive/2009/11/23/wcf-thread-affinity-and-synchronization.aspx

这人说的对吗?是否有来自 Microsoft 的任何明确信息?

0 投票
1 回答
1156 浏览

wcf - ASP.NET、WCF 和每个操作的静态变量——如何安全地使用它们?

我有一个 WCF 服务,并且我有以下(简化的)类:

我想,这是一段非常不言自明的代码。我不需要整个 WCF 服务的单例,而只需要在单个操作调用期间。如果释放了 PerOperationSingleton 的一个实例,则在同一 WCF 操作期间创建一个新实例应该是安全的。

问题是我不知道如何使 _hasInstance 变量仅对一个 WCF 操作有效。我知道 [ThreadStatic],但我听说 ASP.NET 和 WCF 不保证操作将在单个线程上执行 - 它可能会转移到另一个线程。

我绝对不希望我的 _hasInstance = true 移动到线程池并在其他操作从池中选择该线程时被错误地检测到。

如果 WCF 操作移动到另一个线程,我希望 _hasInstance 变量在设置时保持“true”值。

而且我不想更改我的 WCF 服务的一些全局设置以避免影响性能或遇到一些以后难以调试和解决的问题(我对高级 ASP.NET 和 WCF 主题感觉不够精通)。

我也无法将 _hasInstance 存储在会话中,因为我的客户出于各种原因请求禁用 .NET 会话。

我希望 PerOperationSingleton 类实际上与环境无关。它不应该真正了解 WCF 或 ASP.NET。

如何在整个 WCF 操作调用期间使 _hasInstance 变量为静态且不影响其他 WCF 操作?

0 投票
2 回答
236 浏览

.net - 在 .NET 框架代码中使用 ThreadStatic 是否是旧时代的有害遗物?

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

TransactionScope不幸的是,这意味着执行一些线程杂耍(ASP.NET,async 关键字代码)的功能TransactionScope切换线程,但不会复制.

还有另一种机制,CallContext.LogicalGetData(更多here)在线程切换期间正确复制状态(至少在.NET 4.5中)。在我看来,TransactionScope如果它使用 this 而不是[ThreadStatic].

如果正在使用的功能是[ThreadStatic]今天编写的,而不是具有向后兼容性要求的现有功能,它们会使用CallContext.(G|S)etLogicalData?

0 投票
2 回答
10013 浏览

c# - 初始化 ThreadStatic 字段仍然会导致 NullReferenceException

我给自己写了一个多线程随机生成器

但是,它在触发 Next() 时会引发 NullReferenceException,我不明白。这种初始化 ThreadStatic 字段是否以某种方式被禁止?

我知道我可以每次都检查该字段是否已初始化,但这不是我正在寻找的解决方案。