【问题标题】:Passing data between ThreadPool threads在 ThreadPool 线程之间传递数据
【发布时间】:2017-10-17 01:12:43
【问题描述】:

我有一个 C# 网络服务器,我一直在使用 StackOverflow miniprofiler 对其进行分析。因为它不是 ASP.NET 服务器,但每个请求通常都在其自己的线程上执行,所以我操纵 miniprofiler 以使用 ThreadStatic 存储从头到尾跟踪传入请求的所有分析器。这很好用。

最近我们已将所有内容转换为使用async/await,这意味着await 之后的延续通常不会回到相同的Thread,因此ThreadStatic 存储不再有效。

在这种情况下,在不同的ThreadPool 线程之间传递一些小数据的最佳方式是什么?是否有现有的 SynchronizationContext 实现可以用于这样的事情?

【问题讨论】:

  • 你使用的是哪个版本的框架?
  • 对不起,应该提到这一点。我正在使用 4.5。

标签: c# multithreading async-await miniprofiler


【解决方案1】:

在这种情况下,在不同 ThreadPool 线程之间传递一些小数据的最佳方式是什么?

通过CallContext 类使用逻辑调用上下文。它公开了两个静态方法:LogicalSetDataLogicalGetData。调用上下文通过ExecutionContext 进行存储和编组,ExecutionContext 也负责同步上下文等。

使用这个类有两个限制:

  1. 您只能使用 .NET 4.5 及更高版本

  2. 逻辑调用上下文使用写时复制语义,并在数据发生变异后执行浅复制。这意味着您应该只使用不可变数据,因为引用可能在多个线程之间共享。

最后要注意的是CallContext 仅在您调用它时才被初始化。这意味着在使用它时,由于写入时复制,您会承担一些开销。

可以在 Stephan Cleary 名为 Implicit Async Context 的帖子中找到更多信息

【讨论】:

  • @Cuthbert 很高兴为您提供帮助。
  • 感谢您指出浅拷贝和不可变数据的要求。
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多