c# - 为什么 AsyncLocal<T> 传播到子线程而 ThreadLocal<T> 不传播?

标签 c# .net multithreading asynchronous

我不得不用 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# - 为什么 AsyncLocal<T> 传播到子线程而 ThreadLocal<T> 不传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43814346/

相关文章:

c# - Vista下如何为所有用户保存设置

java - 如何使有状态的 JBehave 步骤对于多线程执行是安全的

java - 为什么两个最低和最高优先级的线程仍然交错?

c# - iOS 跟踪 CLCircularRegion - Heisenbug

c# - 使用自定义的覆盖默认的 ClickOnce 初始屏幕

c# - 部署 webAPI 服务器端所需的最少文件

c# - System.IO.File.OpenRead 工作但 System.IO.FileStream 不工作?

c# - C# : Does it sleep the thread the object was instantiated in, 中的 Thread.Sleep() 或我从中调用该方法的线程?

c# - 将 WindowState 设置为最大化会导致窗口出现得太早

c# - DateTime.Now 忽略 Windows 10 设置