【发布时间】:2021-03-12 04:35:03
【问题描述】:
为什么AsyncLocal 字段的值在从类的异步方法设置时不保留。考虑这个例子:
var scope = new TestScope();
// The default value is 0
Console.WriteLine(scope.Counter.Value);
// Setting the vlaue to 2
await scope.SetValueAsync();
Console.WriteLine(scope.Counter.Value);
class TestScope
{
public readonly AsyncLocal<int> Counter = new AsyncLocal<int> { Value = 0 };
public async Task SetValueAsync()
{
this.Counter.Value = 2;
await Task.Yield();
}
}
预期的输出应该是:
0
2
但实际是:
0
0
为什么退出SetValueAsync方法时异步上下文会改变?
【问题讨论】:
-
见 J. Andrew Laughlin 的回答 here
-
是的。我在帖子中找到了原因。但是,是否有任何解决方案可以将
AsyncLocal字段包装在一个类中? -
AsyncLocal<T>用于传递值 down。它不打算返回 值up。虽然您可以破解可变包装器,但我不推荐它。在更复杂的场景中,这很容易导致其他共享问题。最好只使用AsyncLocal<T>向下传递值。
标签: c# .net .net-core async-await