Почему 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 можно использовать для сохранения данных в потоках.