.Net core & SynchronizationContext & Thread.SetData

2024-02-26

据我所知,AspNetCore没有 https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html SynchronizationContext .

“重新进入”请求上下文涉及到许多 内务管理任务,例如设置 HttpContext.Current 和 当前线程的身份和文化。

因此,我创建了一个简单的 .Net Core Api 项目,其中包含以下操作:

    [HttpGet]
    [Route("checkVar")]
    public async Task<IActionResult> checkVar()
    {
        Thread.SetData(Thread.GetNamedDataSlot("Random"),4);
        await Task.Delay(1000);
        var res = Thread.GetData(Thread.GetNamedDataSlot("Random"));
    }

出乎我的意料 ,res的值为4。我很惊讶,因为我相信SetData是同步上下文的一部分。 (这不应该存在于asp.net core中)

更多,当我使用ConfigureAwait(false), 我有null in res.

所以现在我很困惑。因为ConfigureAwait 不应该对 ASP.NET Core 产生影响 https://stackoverflow.com/questions/42053135/configureawaitfalse-relevant-in-asp-net-core

问题:

如果asp.net core没有SynchronizationContext,那为什么呢?4之后可用await?为什么ConfigureAwait在非 SynchronizationContext 环境中更改结果?


我很惊讶,因为我相信 SetData 是同步上下文的一部分。 (这不应该存在于asp.net core中)

No; SetData是线程本地存储(TLS)。所以它与特定的线程相关联。这与同步上下文没有任何关系。

更多,当我使用ConfigureAwait(false)时,我在res中得到null。

根据您运行此代码的时间、服务器的繁忙程度等,您可能会得到null or 4有还是没有ConfigureAwait(false).

如果asp.net core没有SynchronizationContext,那么为什么await之后4可用?

这是一个特定于线程的值。没有SynchronizationContext在 ASP.NET Core 上,您的代码将在任何可用的线程池线程上恢复。如果那个线程happens如果是启动该方法的同一个线程,那么 TLS 将仍然存在,因为它是针对该特定线程的。

同样的行为实际上也适用于 ASP.NET pre-Core。在这种情况下,有一个SynchronizationContext,但该上下文不依赖于任何特定线程。就像 ASP.NET Core 一样,ASP.NET Core 之前版本上的异步方法可以在任何可用的线程池线程上恢复,因此 TLS 数据在某个时间之后可能存在,也可能不存在。await.

为了用数据支持这个理论,尝试记录Environment.CurrentManagedThreadId之前和之后await并查看当前数据与保持不变的 id 之间是否存在任何相关性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net core & SynchronizationContext & Thread.SetData 的相关文章

随机推荐

  • 如何构建、分区和构建大型 MVC 应用程序以便以小的增量片段进行部署?

    我们将开发一个非常大的垂直市场 Web 应用程序 并且倾向于 MVC 方法 它将有 1 个应用程序中所有视图共用的母版页 主控会为整个应用提供一个导航 搜索框架 这将允许用户搜索和选择实体 然后导航到要执行的功能 数据库模型将有 700 到
  • 不能使用公共嵌套类作为私有方法参数

    在下面的代码中 class Outer private void f private Outer Inner in Wrong public class Inner void f public Outer Inner in OK f pri
  • 如何保证 OAuth 消费者秘密的安全,以及当其泄露时如何反应?

    这个问题是关于尝试了解在 Android 等移动平台上实现 oauth 所涉及的安全风险 这里假设我们有一个 Android 应用程序 其代码中嵌入了消费者密钥 秘密 假设消费者的秘密被泄露 并且黑客已经掌握了它 那么会产生什么后果 消费者
  • Debian平台上如何使用pm2启动命令?

    以下是 GitHub 上文档的链接 https github com Unitech pm2 startup script Generation pm2 startup https github com Unitech pm2 startu
  • 当变量为 Null 时 Laravel 5.3 验证失败

    自从 Laravel 从 5 1 升级到 5 3 以来 我在验证方面遇到了一些奇怪的问题 当我发布这样的数据时 firstName null 验证规则是这样的 validator Validator make postData firstN
  • 在 Flask 中迭代提交的表单字段?

    在 Flask 0 8 中 我知道我可以使用以下方式访问各个表单字段form fieldname data 但是有没有一种简单的方法来迭代所有表单字段 我正在构建一个电子邮件正文 我想循环所有字段并为每个字段创建一个字段名称 值条目 而不是
  • 需要在 C 中将 2 的补码转换为十进制的最快方法

    我有 32 位内的某个 18 位 2 的补码 我需要将它们转换为十进制 请给我看一段 C 代码片段 首先你需要做符号扩展 http en wikipedia org wiki Sign extension在你的18位上 填写本机int co
  • svn:数据库已锁定,正在执行语句“RELEASE s0”

    在尝试从私有分支进行合并时 我不断收到列出的错误 数据库被锁定 正在执行语句 RELEASE s0 我运行 collabnet subversion 边缘服务器 1 7 5 3220 94 我运行tortoise svn客户端 Tortoi
  • 创建如果两个表中的行匹配条件则返回 id 的查询

    我正在学习 SQL dbms 并使用 Postgres 我想返回在特定列中都具有特定值的行 例如在表格中Carpets and Curtains 我想得到ids 行 其中颜色为 light yellow 我想我需要加入 但不确定是什么类型
  • 如何在 OpenLayers 5.3.0 中剪切和显示剪切的向量几何

    我必须根据主 限制向量层来剪辑向量层 绘制时 如果绘制图层的某些部分在限制图层之外 则剪掉限制图层之外的区域 示例 1 正如我们所看到的 底部边框的一部分处于限制之外 紫色层 我想知道是否可以向限制层外部的剪辑区域添加功能 示例 2 删除限
  • C 标准数据结构库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 语言 Windows 平台 中经过测试和测试的标准库 它实现了堆栈 队列 树等数据结构
  • 错误:“函数”对象不可下标

    我正在做我的 python 作业 但是当我想测试上面的情况时出现错误 这是我的代码 def evalTerm env t if type t Node for label in t children t label if label Num
  • 安全共享的 Google 日历

    我正在开发一个小型网站 它有一个非常简单的想法 有两组用户 办公室和工人 都必须登录才能访问该网站 该网站是使用Zend框架构建的 问题 我想要一个所有用户都可以访问的日历 办公室工作人员能够编辑日历 而工作人员只能查看日历 我真的很想使用
  • 如何利用MVC中的常用图像资源

    我有几个 ASP NET MVC3 和 4 网站 所有站点都使用独立于库的相同资源 资源是 resx 文件 我想在这些网站内的 html 中使用这些资源中的图像 我之前没有使用过 resx 文件 所以不确定使用它们的好方法是什么 我认为我可
  • 将新节点添加到力导向布局

    关于 Stack Overflow 的第一个问题 请耐心等待 我是 d3 js 的新手 但一直对其他人能够用它完成的事情感到惊讶 并且几乎同样对我自己用它取得的进展如此之少感到惊讶 显然我没有摸到什么 所以我希望这里善良的灵魂可以向我展示光
  • 使用ajax通过单击按钮运行php脚本

    我是一个业余爱好者 对 html javascript php 的了解有限 我设置了一台 Raspberry Pi 微型计算机作为 Web 服务器 首先 我想通过网页上的按钮打开连接到 Pi 的 LED 我有以下有效代码 html 文件的名
  • 手动设置Flutter验证错误

    验证表单并将请求从 flutter 发送到服务器后端后 我想将服务器中的任何潜在错误消息设置为以原始表单显示 最好与验证错误完全相同 例如 Widget build BuildContext context TextFormField on
  • 指针访问和引用访问哪个更快?

    在下面的示例代码中 我分配了 struct Chunk 的一些实例 然后 在 for 循环中 我迭代内存块并使用指针或引用访问不同的实例 并为它们分配一些随机数据 但是哪个 for 循环执行得最快呢 据我所知 我认为引用循环将是最快的 因为
  • 清理 URL 以防止 Rails 中的 XSS

    在 Rails 应用程序中 用户可以创建事件并发布 URL 以链接到外部事件站点 如何清理网址以防止 XSS 链接 提前致谢 XSS 示例 rails 的清理方法无法预防该问题 url javascript alert XSS a href
  • .Net core & SynchronizationContext & Thread.SetData

    据我所知 AspNetCore没有 https blog stephencleary com 2017 03 aspnetcore synchronization context html SynchronizationContext 重新