Назад к вопросам
Middle
4
Можно ли привязать переменную к потоку/таске так, чтобы каждая таска хранила своё значение? Что такое ThreadLocal и AsyncLocal?
Компании, где спрашивали
ИТ Инополис
Ответ от нейросети
sobes.tech AI
Да, в C# можно привязать переменную к конкретному потоку или асинхронной задаче, чтобы каждая из них хранила своё значение.
ThreadLocal<T> — это класс, который позволяет иметь отдельное значение переменной для каждого потока. Например, если у вас несколько потоков, каждый из них будет иметь своё независимое значение переменной.
ThreadLocal<int> threadLocal = new ThreadLocal<int>(() => 0);
void Work() {
threadLocal.Value = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(threadLocal.Value);
}
AsyncLocal<T> — похож на ThreadLocal, но работает в контексте асинхронных операций и сохраняет значение в рамках цепочки вызовов async/await, даже если переключаются потоки.
AsyncLocal<string> asyncLocal = new AsyncLocal<string>();
async Task WorkAsync() {
asyncLocal.Value = "Value for this async context";
await Task.Delay(100);
Console.WriteLine(asyncLocal.Value); // Значение сохраняется даже после await
}
Таким образом, ThreadLocal подходит для многопоточных сценариев, а AsyncLocal — для асинхронных, где поток может меняться, но нужно сохранить контекст.