Sobes.tech
Назад к вопросам
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 — для асинхронных, где поток может меняться, но нужно сохранить контекст.