using System.Threading.Tasks;
using System.Runtime.CompilerServices;
private static AsyncLocal<bool> CanLogPiiVal = new AsyncLocal<bool>();
private static AsyncLocal<StrongBox<bool>> CanLogPiiRef = new AsyncLocal<StrongBox<bool>>();
public static void Main()
CanLogPiiVal.Value = true;
CanLogPiiRef.Value = new StrongBox<bool>(true);
Console.WriteLine("Main val: " + CanLogPiiVal.Value);
Console.WriteLine("Main ref: " + CanLogPiiRef.Value.Value);
Task.Run(() => Outer()).Wait();
private static async Task Outer()
Console.WriteLine("Outer 1 val: " + CanLogPiiVal.Value);
Console.WriteLine("Outer 1 ref: " + CanLogPiiRef.Value.Value);
await Inner().ConfigureAwait(false);
Console.WriteLine("Outer 2 val: " + CanLogPiiVal.Value);
Console.WriteLine("Outer 2 ref: " + CanLogPiiRef.Value.Value);
private static async Task Inner()
Console.WriteLine("Inner 1 val: " + CanLogPiiVal.Value);
Console.WriteLine("Inner 1 ref: " + CanLogPiiRef.Value.Value);
CanLogPiiVal.Value = false;
CanLogPiiRef.Value.Value = false;
Console.WriteLine("Inner 2 val: " + CanLogPiiVal.Value);
Console.WriteLine("Inner 2 ref: " + CanLogPiiRef.Value.Value);