使用 PLINQ 扩展时是否会传输线程标识?

2024-05-01

我正在使用 .AsParallel().ForAll() 在 ASP.NET 请求上下文中并行枚举集合。枚举方法依赖于System.Threading.Thread.CurrentPrincipal。

我是否可以依赖用于将 System.Threading.Thread.CurrentPrincipal 设置为处理 ASP.NET 请求的线程的 HttpContext.Current.User 的各个线程,还是我需要自己进行管理?

提出问题的另一种方式是 PLINQ 使用的线程是否继承调用该操作的线程的标识?


不,身份不会自动传播到这些工作线程。事实上,如果您使用的组件是HttpContext.User你能做的就是捕捉当前的“环境”HttpContext在您的“主”线程中实例并将其传播到您的工作线程。那看起来像这样:

HttpContext currentHttpContext = HttpContext.Current;

myWorkItems.AsParallel().ForAll(wi =>
{ 
    HttpContext.Current = currentHttpContext;

    try
    {
        // anything called from here out will find/use the context of your original ASP.NET thread
    }
    finally
    {
       // Disassociate the context from the worker thread so that it is not held on to beyond its official lifetime
       HttpContext.Current = null;
    }
});

这有效是因为HttpContext.Current由线程静态支持,因此每个工作线程都将从主线程分配实例,并且从该点开始对其执行的任何工作都将将该实例视为当前实例。

现在,你必须意识到HttpContext及其相关的类并不是被设计为线程安全的,所以这有点像黑客。如果您只读取属性,这并不是真正的问题。如果您不使用依赖于HttpContext.Current那么不设置它而是使用捕获的数据会更“干净”currentHttpContext变量直接在worker中。

最后,如果您真正需要的只是将当前主体传播到工作线程,那么您可以使用相同的方法来做到这一点:

Principal logicalPrincipal = Thread.CurrentPrincipal;

myWorkItems.AsParallel().ForAll(wi =>
{ 
    Principal originalWorkerThreadPrincipal = Thread.CurrentPrincipal;
    Thread.CurrentPrincipal = logicalPrincipal;

    try
    {
        // anything called from here out will find the principal from your original thread
    }
    finally
    {
       // Revert to the original identity when work is complete
       Thread.CurrentPrincipal = originalWorkerThreadPrincipal;
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PLINQ 扩展时是否会传输线程标识? 的相关文章

  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • websocket 订阅服务器不工作。无法到达订阅服务器 graphql-ws ws

    我遵循 相同的文档代码 1 使用websocket graphql创建订阅服务器 但它不适用于graphql ws和ws 当我删除 serverCleanup 定义时 代码有效 并且它也适用于旧的订阅库 subscription trans
  • 定期运行 python 程序作为 firebase 中的后台服务

    刚开始使用 firebase React 来构建一个网站 我网站的设计功能之一是抓取并向用户显示从另一个网站解析的数据 例如股票价格变化 我已经有一个 python 爬虫负责解析数据 但我不知道如何在 firebase 中执行我的服务器的这
  • 循环遍历文件扩展名,excel vba

    我正在使用文件扩展名数组并循环访问工作簿文件夹 该代码正在命名 Sheet 1 name MyName 我注意到尽管 xlsm 不在数组中 它仍在打开并命名工作表 这是代码 任何人都可以看看他们是否遇到同样的问题并且能够解决它 Sub Lo
  • 如何创建设置为太平洋标准时间午夜的 DateTimeOffset

    我正在使用 Quartz NET http quartznet sourceforge net http quartznet sourceforge net 我试图将开始日期设置在午夜 但我在创建这个日期时遇到问题 该应用程序将位于不同时区
  • 如何在自动完成地点中获取城市和州名称 _ Places API

    我正在使用地点自动完成功能从用户中选择城市 其工作正常 但现在我想要城市和州名 我的代码 正在初始化 List
  • 如何在 git 中使用 --work-tree 选项?我不断收到错误消息

    我有一个普通的存储库 其中有一个工作树和一个与工作树位于同一目录中的 git 文件夹 我正在尝试使用以下命令从该位置外部运行 git 命令 git git dir path to repo git work tree path to rep
  • 使用 ajax 渲染部分视图

    我查过这个问题 https stackoverflow com questions 4888521 asp net mvc3 razor views and partialviews with ajax postbacks它解决了我最初的问
  • Java EE 6 中的多租户支持

    我有一个现有的 Java EE 6 应用程序 部署在 Glassfish v 3 1 中 并且希望支持多个租户 我当前在应用程序中使用的技术 API 是 EJB 包括EJB定时器服务 JPA 2 0 EclipseLink JSF 2 0
  • 高级自定义字段 – 具有多个输入的自定义字段类型

    我正在尝试为 ACF 创建一个新的字段类型 其中包含多个输入或存储值数组 原因是我希望为一组输入字段提供一些交互性和自定义布局 我按照这个教程http www advancedcustomfields com resources tutor
  • 在 jQuery 中从 asp.net runat 服务器获取 ID

    我正在尝试使用 ASP NET 在 jQuery 中制作一些东西 但身份证来自runat server 与 HTML 中使用的 id 不同 我曾经用它来从这种情况中获取ID val 但在这种情况下 它不起作用 我不知道为什么 JavaScr
  • Neo4j 2.0 唯一约束错误“节点已存在”,当它不存在时

    我在 Neo4j 唯一约束方面遇到了一些麻烦 其中 CREATE cypher 语句由于节点已经存在而无法执行 问题是 它不 存在 此外 昨天使用这些确切数据的精确流程也有效 我的neo4j版本是ubuntu 12 04 3上的commun
  • Javascript 'this' 覆盖 Z 组合器和所有其他递归函数

    背景 我有一个由a实现的递归函数Z 组合器如图所示here https stackoverflow com questions 17645356 anonymous recursion any way to replace javascri
  • WScript.Shell.Exec - 从 stdout 读取输出

    我的 VBScript 不显示我执行的任何命令的结果 我知道命令被执行 但我想捕获结果 我已经测试了多种方法来执行此操作 例如以下方法 Const WshFinished 1 Const WshFailed 2 strCommand pin
  • 测试抽象模型 - django 2.2.4 / sqlite3 2.6.0

    我正在尝试使用 django 2 2 4 sqlite3 2 6 0 python 3 6 8 测试一些简单的抽象混合 目前 我在使用架构编辑器从测试数据库中删除模型时遇到问题 我有以下测试用例 from django test impor
  • Web 服务版本控制策略的优缺点

    更新20100224 我真的不需要某些供应商网站上的一些蹩脚定义 我正在寻找的是实际实施以及实际实施这些东西的人们在日常 IT 业务周期中面临的挑战 更多内容如下 尚未制定 采用任何退休策略 显然需要制定一项策略 我对您如何制定该战略并将其
  • 矩形相当于文本的文本锚点表示属性吗?

    是否有一个与文本的文本锚点表示属性等效的矩形 我希望能够从左侧 右侧或根据情况定位矩形 我知道这可以通过一些简单的计算来完成 但我只是想知道是否已经存在内置的东西 文本锚点演示属性上的链接 https developer mozilla o
  • Shutil.rmtree() 引发异常 WindowsError:访问被拒绝:

    尝试使用 python 脚本自动删除文件 我得到 Traceback most recent call last Python script 5 line 8 in
  • 减少 CSS 网格中的行间距

    我想知道如何减少行间距 我尝试过将边距和填充设置为 0 但似乎没有什么效果 左侧为桌面视图 右侧为移动视图 content margin 0 padding 0 width 100 display grid grid gap 5px gri
  • 优化spark sql中分区数据写入S3

    我在每个 Spark 作业运行中从 HDFS 读取大约 700 GB 的数据 我的工作读取这些数据 过滤大约 60 的数据 将其分区如下 val toBePublishedSignals hiveCtx sql some query toB
  • 使用 PLINQ 扩展时是否会传输线程标识?

    我正在使用 AsParallel ForAll 在 ASP NET 请求上下文中并行枚举集合 枚举方法依赖于System Threading Thread CurrentPrincipal 我是否可以依赖用于将 System Threadi