在使用AsyncLocal时,建议使用异步方法或将值存储在Task Scoped中,以避免AsyncLocal出现未预期的行为。以下是一个例子:
public static class AsyncLocalValueProvider
{
private static readonly AsyncLocal _value = new AsyncLocal();
public static int Value
{
get => _value.Value;
set => _value.Value = value;
}
}
public async Task GetValueAsync()
{
AsyncLocalValueProvider.Value = 42;
return await Task.FromResult(AsyncLocalValueProvider.Value);
}
public void CallGetValue()
{
int value = GetValueAsync().GetAwaiter().GetResult();
Console.WriteLine(value); // Output: 42
}
在上面的代码中,我们使用静态的“AsyncLocalValueProvider”存储异步方法中的值。然后,在调用代码中,我们通过等待异步任务来读取值,并输出。请注意,即使没有使用“async await”语法,AsyncLocalValueProvider的值也会被正确地传递给异步方法。