c# – 为什么AsyncLocal传播到子线程,而ThreadLocal没有?
发布时间:2020-12-15 08:20:10 所属栏目:百科 来源:网络整理
导读:我不得不在我的代码中使用AsyncLocal替换ThreadLocal的使用,以便在等待异步操作时保持“环境状态”. 但是,AsyncLocal令人讨厌的行为是它“流动”到子线程.这与ThreadLocal不同.反正有没有阻止这个? class Program{ private static readonly ThreadLocalstri
我不得不在我的代码中使用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(...); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |