【问题标题】:What "Current" properties flow with ExecutionContext哪些“当前”属性随 ExecutionContext 流动
【发布时间】:2013-06-21 18:33:37
【问题描述】:

这是一个两部分的问题:

  1. 谁能提供一个 ASP.NET/.NET 属性的列表,这些属性通常是与 ExecutionContext 一起流动的线程本地?

    HttpContext.Current? Thread.CurrentContext? Thread.CurrentPrincipal? Thread.CurrentCulture?

    我可以依靠哪些属性来生存/持久异步/等待?

    还有什么?

  2. 有什么方法可以添加应用程序特定的上下文信息,这些信息会随着 ExecutionContext 自动流动?类似的东西

    var ec = ExecutionContext.Capture();
    ec.CustomContext["MyCustomContext"] = ACustomContext;
    

【问题讨论】:

  • 你到底想做什么?为什么您觉得需要存储自定义上下文?
  • 如果您有两个单独的问题,您应该问两个问题
  • @ReedCopsey,我正在尝试重构一些利用 ThreadStatic 和其他线程本地存储机制的遗留代码,以便它可以很好地与 async/await 配合使用。
  • @JoeEnzminger,您可能想检查一下:referencesource.microsoft.com/#mscorlib/system/threading/…

标签: .net multithreading async-await


【解决方案1】:

这方面的最佳资源是 Stephen Toub 的 ExecutionContext vs. SynchronizationContext。没有您要查找的属性列表。

ASP.NET 实际上使用SynchronizationContext 来流HttpContext.Currenttreats Thread.CurrentPrincipal rather oddly

您可以使用LogicalSetData/LogicalGetData 添加自己的上下文。但是,您应该只存储不可变数据。我记录了这个on my blog

【讨论】:

  • 感谢(对于 LogicalSetData/LogicalGetData)。我已经阅读了您已经提到的每篇文章,但它仍然没有解决框架上下文流程的问题。似乎对记录很重要...
  • @JoeEnzminger:顺便说一句,我不推荐逻辑获取/设置数据。如果您找不到其他解决方案,它只是可能使用。我还没有运行基准测试,但我希望它比ThreadStatic 慢得多。显式方法参数或实例字段将是我选择的解决方案。
  • +1。有趣的是,尽管没有记录,但实际上流了什么:referencesource.microsoft.com/#mscorlib/system/threading/…。特别有趣的是同步上下文是如何通过ExecutionContext.Run 显式传递的,而不是隐式传递的。
  • @Noseratio 如果您阅读 Toub 的链接文章(特别是最后几段),您会发现 SynchrnoizationContext 实际上大部分时间都在流动(不确定您表示显式/隐式)。
  • @OhadSchneider,明确地我的意思是明确地调用ExecutionContext.CaptureExecutionContext.Run隐含地我的意思是让 async/await 基础设施流动它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2020-08-04
相关资源
最近更新 更多