我有一个C#webserver,我一直使用StackOverflow miniprofiler进行分析。因为它不是ASP.NET服务器,但每个请求通常都是在自己的线程上执行的,所以我操纵了miniprofiler使用ThreadStatic
存储来跟踪从开始到结束的传入请求的所有分析器。这很有效。
最近我们已将所有内容转换为使用async/await
,这意味着在await
通常不会返回到同一Thread
因此ThreadStatic
存储空间后继续不再有用了。
在这种情况下,在不同的ThreadPool
线程之间传递一小段数据的最佳方法是什么?是否存在对此类内容有用的SynchronizationContext
实现?
答案 0 :(得分:8)
在这种情况下,在不同的ThreadPool线程之间传递一小段数据的最佳方法是什么?
通过CallContext
类使用逻辑调用上下文。它公开了两种静态方法:LogicalSetData
和LogicalGetData
。呼叫上下文通过ExecutionContext
存储和编组,CallContext
也负责同步上下文等。
使用此类有两个限制:
您仅限于使用.NET 4.5及以上版本
逻辑调用上下文使用写时复制语义,并在数据发生变异后执行浅拷贝。这意味着您应该只使用不可变数据,因为引用可以跨多个线程共享。
最后要注意的是@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
的文章中找到