我不得不在我的代码中用AsyncLocal替换ThreadLocal的使用,以便环境状态'在等待异步操作时保持不变。
然而,AsyncLocal令人讨厌的行为是它流动了#39;到子线程。这与ThreadLocal不同。反正有没有阻止这个?
void View::displayModel(Model &model)
{
for (Potato *potato : model.allPotatoes)
{
//has to call the right thing for Potato, SmallPotato, etc.
display(*potato);
}
}
答案 0 :(得分:10)
AsyncLocal
将数据存储在执行上下文中,该上下文由大多数API(包括Task.Run
)自动传送。
防止这种情况的一种方法是在需要时明确地抑制流程:
using (ExecutionContext.SuppressFlow())
{
Task.Run(...);
}