Почему AsyncLocal отличается от CallContext

Запустив приведенный ниже код, вы увидите, что между CallContext и AsyncLocal есть различие.

using System;
using System.Runtime.Remoting.Messaging;
using System.Threading;

namespace AsyncLocalIsDifferentThanCallContext
{
    class Program
    {
        public static AsyncLocal<int> AsyncLocal = new AsyncLocal<int>();

        public static int CallContextValue
        {
            get
            {
                var data = CallContext.GetData("CallContextValue");
                if (data == null)
                    return 0;
                return (int) data;
            }
            set { CallContext.SetData("CallContextValue", value); }
        }

        static void Main(string[] args)
        {
            AsyncLocal.Value = 1;
            CallContextValue = 1;
            new Thread(() =>
            {
                Console.WriteLine("From thread AsyncLocal: " + AsyncLocal.Value); // Should be 0 but is 1
                Console.WriteLine("From thread CallContext: " + CallContextValue); // Value is 0, as it should be
            }).Start();
            Console.WriteLine("Main AsyncLocal: " + AsyncLocal.Value);
            Console.WriteLine("Main CallContext: " + CallContextValue);
        }
    }
}

Вы можете объяснить, почему?

Я ожидал, что значение AsyncLocal будет уникальным для каждого потока, поскольку в документации сказано, что он должен вести себя так же, как и CallContext.

1 ответ

Решение

Ты думаешь о ThreadLocal? AsyncLocal может течь через потоки, как он говорит

Поскольку модель асинхронного программирования на основе задач имеет тенденцию абстрагировать использование потоков, экземпляры AsyncLocal можно использовать для сохранения данных в потоках.

Другие вопросы по тегам