为什么AsyncLocal <t>传播到子线程,而ThreadLocal <t>不传播?

时间:2017-05-05 22:02:00

标签: c# .net multithreading asynchronous

我不得不在我的代码中用AsyncLocal替换ThreadLocal的使用,以便环境状态&#39;在等待异步操作时保持不变。

然而,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);
    }
}

1 个答案:

答案 0 :(得分:10)

AsyncLocal将数据存储在执行上下文中,该上下文由大多数API(包括Task.Run)自动传送。

防止这种情况的一种方法是在需要时明确地抑制流程:

using (ExecutionContext.SuppressFlow())
{
    Task.Run(...);
}