8

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

最近我们已经将所有内容都转换为 use async/await,这意味着在 a 之后的延续await通常不会回到相同的状态Thread,因此ThreadStatic存储不再起作用。

ThreadPool在这种情况下,在不同线程之间传递一些小数据的最佳方法是什么?是否存在SynchronizationContext对此类有用的现有实现?

4

1 回答 1

8

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

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

使用这个类有两个限制:

  1. 您仅限使用 .NET 4.5 及更高版本

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

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

更多信息可以在 Stephan Cleary 的一篇名为Implicit Async Context的文章中找到

于 2015-04-22T20:55:51.630 回答