.NET Framework Contexte d'exécution fluide avec AsyncLocal


Exemple

Lorsque vous devez transmettre des données de la tâche parente à ses tâches enfants, de manière à ce AsyncLocal à l'exécution, utilisez la classe AsyncLocal :

void Main()
{
    AsyncLocal<string> user = new AsyncLocal<string>();
    user.Value = "initial user";
    
    // this does not affect other tasks - values are local relative to the branches of execution flow
    Task.Run(() => user.Value = "user from another task"); 
    
    var task1 = Task.Run(() =>
    {
        Console.WriteLine(user.Value); // outputs "initial user"
        Task.Run(() =>
        {
            // outputs "initial user" - value has flown from main method to this task without being changed
            Console.WriteLine(user.Value);
        }).Wait();

        user.Value = "user from task1";

        Task.Run(() =>
        {
            // outputs "user from task1" - value has flown from main method to task1
            // than value was changed and flown to this task.
            Console.WriteLine(user.Value);
        }).Wait();
    });
    
    task1.Wait();
    
    // ouputs "initial user" - changes do not propagate back upstream the execution flow    
    Console.WriteLine(user.Value); 
}

Note: Comme on peut le voir dans l'exemple ci-dessus, AsynLocal.Value a une copy on read sémantique de copy on read , mais si vous AsynLocal.Value un type de référence et modifiez ses propriétés, vous affecterez d'autres tâches. Par conséquent, la meilleure pratique avec AsyncLocal consiste à utiliser des types de valeur ou des types immuables.