c# – 为什么AsyncLocal传播到子线程,而ThreadLocal没有?

前端之家收集整理的这篇文章主要介绍了c# – 为什么AsyncLocal传播到子线程,而ThreadLocal没有?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不得不在我的代码中使用AsyncLocal替换ThreadLocal的使用,以便在等待异步操作时保持“环境状态”.

但是,AsyncLocal令人讨厌的行为是它“流动”到子线程.这与ThreadLocal不同.反正有没有阻止这个?

class Program
{
    private static readonly ThreadLocal<string> ThreadState = new ThreadLocal<string>();
    private static readonly AsyncLocal<string> AsyncState = new AsyncLocal<string>();

    static async Task MainAsync()
    {
        ThreadState.Value = "thread";
        AsyncState.Value = "async";

        await Task.Yield();

        WriteLine("After await: " + ThreadState.Value); 
        WriteLine("After await: " + AsyncState.Value); // <- I want this behavIoUr

        Task.Run(() => WriteLine("Inside child task: " + ThreadState.Value)).Wait(); // <- I want this behavIoUr
        Task.Run(() => WriteLine("Inside child task: " + AsyncState.Value)).Wait();

解决方法

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

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

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

猜你在找的C#相关文章