Я заметил, что CallContext.LogicalSetData/LogicalGetData не работает так, как я ожидал от них. Значение, установленное внутри метода async, восстанавливается , даже если нет асинхронности или любого типа переключения потоков.
Вот простой пример:
using System;
using System.Runtime.Remoting.Messaging;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication
{
    class Program
    {
        static async Task<int> TestAsync()
        {
            CallContext.LogicalSetData("valueX", "dataX");
            // commented out on purpose
            // await Task.FromResult(0); 
            Console.WriteLine(CallContext.LogicalGetData("valueX"));
            return 42;
        }
        static void Main(string[] args)
        {
            using(ExecutionContext.SuppressFlow())
            {
                CallContext.LogicalSetData("valueX", "dataXX");
                Console.WriteLine(CallContext.LogicalGetData("valueX"));
                Console.WriteLine(TestAsync().Result);
                Console.WriteLine(CallContext.LogicalGetData("valueX"));
            }
        }
    }
}
Он производит этот вывод:
dataXX dataX 42 dataXX
Если я делаю TestAsync не-async, он работает как ожидалось:
static Task<int> TestAsync()
{
    CallContext.LogicalSetData("valueX", "dataX");
    Console.WriteLine(CallContext.LogicalGetData("valueX"));
    return Task.FromResult(42);
}
Вывод:
dataXX dataX 42 dataX
Я бы понял это поведение, если бы у меня была какая-то настоящая асинхронность внутри TestAsync, но это не так. Я даже использую ExecutionContext.SuppressFlow, но это ничего не меняет.
Может кто-нибудь объяснить, почему он работает таким образом?
