using System.Threading.Tasks;
using System.Collections.Generic;
static AsyncLocal<string> _asyncLocal = new AsyncLocal<string>();
static async Task AsyncMain()
_asyncLocal.Value = "main";
var t1 = AsyncTask("task 1", 200);
Console.WriteLine("Called AsyncTask 1.");
Console.WriteLine(" AsyncLocal value is '{0}'", _asyncLocal.Value);
var t2 = AsyncTask("task 2", 100);
Console.WriteLine("Called AsyncTask 2.");
Console.WriteLine(" AsyncLocal value is '{0}'", _asyncLocal.Value);
await Task.WhenAll(new List<Task>{ t1, t2 });
Console.WriteLine("Awaited tasks.");
Console.WriteLine(" AsyncLocal value is '{0}'", _asyncLocal.Value);
static async Task AsyncTask(string expectedValue, Int32 delay)
_asyncLocal.Value = expectedValue;
Console.WriteLine("In AsyncTask, expect '{0}'", expectedValue);
Console.WriteLine(" AsyncLocal value is '{0}'", _asyncLocal.Value);
public static void Main()