using System.Threading.Tasks;
static AsyncLocal<string> _asyncLocalString = new AsyncLocal<string>();
static ThreadLocal<string> _threadLocalString = new ThreadLocal<string>();
static async Task AsyncMethodA()
_asyncLocalString.Value = "Value 1";
_threadLocalString.Value = "Value 1";
var t1 = AsyncMethodB("Value 1");
_asyncLocalString.Value = "Value 2";
_threadLocalString.Value = "Value 2";
var t2 = AsyncMethodB("Value 2");
Console.WriteLine("Awaited AsyncMethodB 1.");
Console.WriteLine(" AsyncLocal value is '{0}', ThreadLocal value is '{1}'",
_asyncLocalString.Value, _threadLocalString.Value);
Console.WriteLine("Awaited AsyncMethodB 2.");
Console.WriteLine(" AsyncLocal value is '{0}', ThreadLocal value is '{1}'",
_asyncLocalString.Value, _threadLocalString.Value);
static async Task AsyncMethodB(string expectedValue)
Console.WriteLine("Entering AsyncMethodB.");
Console.WriteLine(" Expected '{0}', AsyncLocal value is '{1}', ThreadLocal value is '{2}'",
expectedValue, _asyncLocalString.Value, _threadLocalString.Value);
_asyncLocalString.Value = expectedValue + " - internal";
Console.WriteLine("Exiting AsyncMethodB.");
Console.WriteLine(" Expected '{0}', got '{1}', ThreadLocal value is '{2}'",
expectedValue, _asyncLocalString.Value, _threadLocalString.Value);
public static void Main()