在ThreadPool线程之间传递数据

Cut*_*ert 8 c# multithreading async-await miniprofiler

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

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

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

Yuv*_*kov 8

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

通过CallContext类使用逻辑调用上下文.它暴露了两种静态方法:LogicalSetDataLogicalGetData.呼叫上下文通过其存储和编组ExecutionContext,也负责同步上下文等.

使用此类有两个限制:

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

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

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

更多相关内容可以在Stephan Cleary的一篇名为Implicit Async Context的文章中找到

  • 正是我在找什么,谢谢. (3认同)