我不得不用 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/