Cut*_*ert 8 c# multithreading async-await miniprofiler
我有一个C#webserver,我一直在使用StackOverflow miniprofiler进行分析.因为它不是ASP.NET服务器,但每个请求通常都是在自己的线程上执行的,所以我操纵了miniprofiler使用ThreadStatic
存储来跟踪从开始到结束的传入请求的所有分析器.这很好用.
最近我们已将所有内容转换为使用async/await
,这意味着在await
通常不会返回到相同内容之后继续Thread
,因此ThreadStatic
存储不再有效.
ThreadPool
在这种情况下,在不同线程之间传递一些小数据的最佳方法是什么?是否存在SynchronizationContext
对此类内容有用的现有实现?
在这种情况下,在不同的ThreadPool线程之间传递一些小数据的最佳方法是什么?
通过CallContext
类使用逻辑调用上下文.它暴露了两种静态方法:LogicalSetData
和LogicalGetData
.呼叫上下文通过其存储和编组ExecutionContext
,也负责同步上下文等.
使用此类有两个限制:
您仅限于使用.NET 4.5及更高版本
逻辑调用上下文使用写时复制语义,并在数据发生变化后执行浅拷贝.这意味着您应该只使用不可变数据,因为引用可以跨多个线程共享.
最后要注意的是CallContext
,只有在调用它时才会初始化.这意味着在使用它时,由于写时复制,您需要承担一些开销.
更多相关内容可以在Stephan Cleary的一篇名为Implicit Async Context的文章中找到
归档时间: |
|
查看次数: |
744 次 |
最近记录: |