问题标签 [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# - ThreadStatic 与 ThreadLocal: 泛型比属性好吗?
[ThreadStatic]
使用属性定义,而ThreadLocal<T>
使用泛型。为什么选择不同的设计解决方案?在这种情况下,使用泛型优于属性有什么优点和缺点?
c# - 将 [ThreadStatic] 属性应用于外部程序集中的方法
我可以使用外部程序集的static method
类似[ThreadStatic]
方法吗?
这是我的情况。(assembly class
我无法访问其源代码)具有这种结构
DoWork()
注册后,如果不取消注册之前注册的 ID ,我就无法使用其他 ID 拨打电话。实际上,我想DoWork()
通过多线程同时调用具有不同 ID 的方法。
如果RegisterConfiguration(int ID)
方法是[ThreadStatic]
,我可以在不同的线程中调用它而不会出现调用问题,对吧?那么,我可以将[ThreadStatic]
属性应用于此方法还是有其他方法可以同时调用这两个static
方法而无需等待其他线程取消注册它?
如果我像下面这样检查它,它应该可以工作。
asp.net-mvc - 在请求处理期间是否可以进行线程切换?
我有一个 MVC 应用程序,它也使用 EF 和一个简单的工作单元模式实现。这是我的UnitOfWork
样子:
我有一个通用存储库,它封装了常见的数据库操作:
如何使用:
因此,问题是 MVC 框架是否有可能在处理请求时在内部切换线程。由于当前UnitOfWork
是线程静态的,所以这样的开关会NullReferenceException
在调用时引起UnitOfWork.Current
(如果我不对,请更正)。
iis - 如何使用 Powershell 杀死特定 processID 的线程
好吧,这几天断断续续地困扰着我。我在一个客户站点,他们有许多定制的、内部编写的、在 Windows 2008R2 IIS 服务器上运行的服务。问题是其中一些服务一直挂起,它们被困在“停止”状态,杀死它们的唯一方法是打开进程资源管理器并杀死线程。在任何人谈论使用“runas”,或以本地管理员或服务所有者身份登录之前,我们已经经历了所有这些。
问题在于可执行文件本身。另一个国家的开发团队将对此进行研究,但至少需要 4-5 个月,我们不确定他们是否会做对。
我有一个 Powershell 脚本来定期检查服务,它能够确保服务正在运行,如果没有,则强制停止并重新启动服务,然后它会发送一封电子邮件以确认操作。但是,对于提到的这些特定服务,它无能为力。它们不能在任务管理器、taskkill 或进程资源管理器中被杀死(除非有人杀死线程)它只是说访问被拒绝。可以在进程资源管理器中更改权限并将其终止,但这是一个比终止线程更长的过程。
为了让事情变得更加困难,我不能使用进程名称,因为在这台服务器上还有另外两个网站使用同名的 exe,只是在不同的文件夹中。我所追求的是一种找到并杀死进程ID的线程的方法,我已经通过我的脚本获得了这个,所以脚本的其余部分可以完成重新启动所述服务的任务。目前该服务在整个白天和晚上都以不一致的方式死亡,支持人员必须 RDP 到服务器上,打开进程资源管理器,找到有问题的进程并杀死线程然后重新启动服务。对于这些已经过度工作的人来说有点麻烦,特别是如果我们可以让 powershell 自动完成。
希望有人可以在这方面提供帮助。提前致谢。
c# - ThreadStatic 和 ASP.NET
我需要通过单独的授权规则列表来保护我的业务对象属性。我希望在各种操作期间暂停我的授权规则,例如转换为 DTO 和执行验证规则(验证当前用户无权查看的属性值)。
我正在研究的方法将调用包装在一个范围对象中,该对象使用 [ThreadStatic] 属性来确定是否应该运行授权规则:
这是 IsAuthorized 检查(来自基类):
这是演示用法的 ValidateProperty 方法(来自基类):
我对范围对象进行了一些测试,表明只要 lambda 在 using 语句的范围内解析,就会使用 SuspendedAuthorizationScope.AuthorizationRulesAreSuspended 的预期/正确值。
这个设计有什么明显的缺陷吗?就线程而言,我应该关注 ASP.NET 中的任何内容吗?
c# - 奇怪的“索引超出范围”(多线程问题)
我正在用 C# (Visual Studio 2013) 编写 Windows 服务。该服务为其连接的每个服务器激活一个线程。
'server' 对象被定义为 'ThreadStatic' (因此每个线程都应该将其作为不同的对象访问):
在调试时 - 我有时会收到错误:
它出现在以下行中(在“服务器”线程的方法内):
但奇怪的是调试器显示这些值是好的:
所以应该没有错误!!!
当我按 F11 (调试器步骤)时,它会继续调试,好像一切都很好,并且分配也有效......
为什么?????:0
在分配当前线程的值之前,是否是 Visual Studio 中的错误提示错误?或者我没有使用线程 saftley(更有可能)?
c# - 如何在 C# 中跨异步等待模型维护线程上下文?
每次等待完成“选项”时是否使用 ThreadStatic 并设置上下文?还有其他方法吗?
如果我不想使用 ThreadStatic,现在还有另一种方法吗?
c# - 线程静态、ASP.NET 和异步处理程序
请考虑这些场景:
- 异步 .ashx 处理程序
- 异步 .asmx 网络服务方法
- 一种同步 MVC 5 控制器动作方法
我试图找出一种方法来设置可以在“逻辑”http请求期间一致访问的“逻辑线程”特定数据,即如果数据是在哪个异步处理程序的“BeginExecute”部分的线程上设置的您会考虑,即使 ASP.NET 在不同的 OS/.Net 线程上执行“EndExecute”部分,该数据也可以在该 asnc 处理程序的“EndExecute”部分中使用。
此外,如果第二个请求被分配了先前分配给第一个 http 请求的线程它在“BeginExecute”部分,但随着第一个 http 请求进入其异步操作(并且它可能仍在完成其异步操作),该线程被释放。
我相信 .Net 中的“逻辑线程”或“逻辑线程上下文”这个词实际上意味着我提到的相同的“逻辑”操作流程(而不是不断重新分配的底层 OS/.Net 线程)。如果从工作流的角度来看,每个 http 请求都是一个新的“逻辑”操作(即使多个用户按顺序或并行调用同一个 Web 服务,每个请求都是一个新的独立逻辑操作),并且在这个意思是,“逻辑”操作是一次性的,不能重复。然而,相同的底层 OS/.Net 线程可以在它们到达时根据它们的可用性映射到“逻辑”操作。
此外,我想将此数据公开为 HttpContext.Current 类型的静态属性。对于某些人来说,这可能会让人感到意外,但是如果您使用例如异步 .asmx Web 服务方法,HttpContext.Current 将无法正常工作。我确定我已经阅读了网络上的内容,其中说 HttpContext.Current 应该始终返回正确的 HttpContext,但我在 .asmx web-methods 的 EndExecuteMethod 中看到它为空。如果 somecan 可以确认我的最后一个陈述是否正确,那就太好了,但这个陈述并不是我想在这里提出的总体问题。
在阅读了大量文献后(例如log4net.ThreadContext 和 log4net.LogicalThreadContext 有什么区别?,http ://msmvps.com/blogs/jon_skeet/archive/2010/11/08/the-importance-of-context -and-a-question-of-explicitness.aspx,http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html和更多包括 MSDN 文档),这是我的推论:
- ThreadStatic 对于底层 OS/.Net 线程是本地的,而不是“逻辑”操作,因此在我的示例中;如果第二个 http 请求被分配与第一个线程的“BeginExecute”相同的线程,则“BeginExecute”中第一个 http 请求的数据集将在下一个 http 请求中可见。如果恰好被 .Net 重新分配给另一个线程(这在绝大多数情况下都会发生),那么这些数据在“EndExecute”中将不可用。
- Thread.SetData 对我的用例来说更成问题。它需要传入数据槽,如果我要从 Thread.GetNamedDataSlot 的返回值传入数据槽,则该信息在整个应用程序域中都可用;因为命名的数据槽在线程之间共享。
- CallContext.SetData 就像 ThreadStatic (这意味着它不被应用程序域共享,但是如果不同的 http 请求被分配给相同的底层 OS/.Net 线程,它们会看到相同的数据)。CallContext.SetData 提供了一种额外的能力来编组 RPC 调用的上下文数据,这与当前提出的问题无关。
- 然后是 ThreadLocal 类(.Net 4/.Net 4.5)。它似乎可以解决我的问题的一部分,我可以在 BeingExecute 操作的 stateObject 中传递它,并从 endExecute 操作的相同 stateObject 参数中提取。从这个角度来看,ThreadLocal 似乎是为.Net 的异步支持而编写的。但是当我需要像 HttpContext.Current 一样访问它时它不起作用,因为我看不到保留它的“逻辑线程静态”实例(除非我在前面的 3 点中说错了一些东西)。
- 最后,似乎 CallContext.LogicalSetData 完成了我想要实现的目标。使用一组 CallContext.LogicalSetData 和 CallContext.LogicalGetData 方法,我应该能够实现类似 HttpContext.Current 的影响,它适用于“逻辑任务执行”。
现在问题来了:
- 我上面所说的一切是否正确。请更正我所做的任何和所有不正确的声明。
- 我错过了.Net 中的线程静态类型功能是否还有其他可用选项。
- CallContext.LogicalSetData/LogicalGetData 是否将上下文数据传递给 RPC 调用(msdn 页面没有明确提及, http: //msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.callcontext.logicalsetdata (v=vs.110).aspx )。
- 使用 CallContext.LogicalSetData/LogicalGetData 是否有任何缺点(性能方面或其他方面)。
- 此页面说明了 LogicalSetData 的写时复制行为:http: //blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html。在异步处理程序/异步 MVC 5 操作方法的上下文中,如果我使用logicalsetdata 保存引用类型并稍后更改引用类型的状态会有什么影响。什么是recucursions。
- 对于mutation/logicalsetdata/async,我仍然无法通过对对象进行变异来查看问题所在。当异步方法启动时,写时复制行为将在下次调用logicalsetdata时触发上下文数据的副本。这是一个浅拷贝,所以我的引用对象现在实际上由 2 个逻辑上下文共享,并且一个上下文中的更改在另一个上下文中是可见的,这是我通常期望的引用类型。
一个很长的问题,有很多参考资料,但希望我的研究做得很好,而且答案也会让其他人受益。
c# - 访问 ThreadStatic - 来自线程外部的变量
我已将变量定义为 ThreadStatic:
现在,我应该从 MainThread (已启动新线程)设置变量 Monitoring:
有没有办法做到这一点?
c# - ThreadStatic 字段 VS 方法参数 VS 每个线程一个实例
我正在开发一个多线程应用程序,因此,我一直试图不使用可能会在我在不同线程中使用的类型实例中引发冲突的私有字段。相反,我一直在收集作为方法参数工作所需的信息。这导致了几十个方法都声明了相同的参数:
现在我正在考虑重新设计类型并为每个工作线程创建一个实例,但后来我偶然发现了 ThreadStatic 属性。
只声明一个私有线程静态字段,在每个线程正在调用的主方法中对其进行初始化并在所有子方法中重用该字段,从而使参数过时,这是一个好主意吗?或者它有什么缺点,所以我宁愿专注于为每个线程创建一个新实例?