在ThreadPool线程

时间:2015-04-22 19:10:23

标签: c# multithreading async-await miniprofiler

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

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

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

1 个答案:

答案 0 :(得分:8)

  

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

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

使用此类有两个限制:

  1. 您仅限于使用.NET 4.5及以上版本

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

  3. 最后要注意的是@ECHO OFF SETLOCAL SET "source1=U:\sourcedir" SET "source2=U:\sourcedir2" SET "source3=U:\source dir3" SET "destdir=U:\destdir" DEL "%destdir%\*.txt" FOR %%d IN ("%source1%" "%source2%" "%source3%" ) DO CALL :process %%d GOTO :EOF :process ECHO(XCOPY %1 "%destdir%\TFX Logs\" /s /y PUSHD %1 FOR /f %%a IN ('dir /b /o-d TFX_*.log') DO >>"%destdir%\ImportReport_%tday%.txt" ( ECHO %~1,%%~ta,%%~za,%%a popd GOTO :eof ) popd GOTO :eof 只有在您调用它时才会被初始化。这意味着在使用它时,由于写入时的复制,您需要承担一些开销。

    更多相关内容可以在Stephan Cleary的一篇名为Implicit Async Context

    的文章中找到