C#에서 스레드별 데이터 저장을 위해 자주 사용되는 두 가지 키워드, [ThreadStatic]과 AsyncLocal<T>의 차이점과 활용법을 알아봅니다.
1. [ThreadStatic] 개념과 특징
[ThreadStatic]은 스레드별로 독립된 정적 변수를 선언할 때 사용합니다. 각 스레드는 해당 필드의 별도 복사본을 갖게 되어, 여러 스레드가 동시에 같은 필드에 접근해도 데이터가 섞이지 않습니다.
[ThreadStatic]
private static int _field;
public void Increment()
{
_field++;
Console.WriteLine($"스레드 {Thread.CurrentThread.ManagedThreadId}: {_field}");
}
하지만 [ThreadStatic]은 비동기 메서드의 컨텍스트 흐름을 따라가지 않습니다. 즉, 비동기 메서드 내에서 실행 흐름이 다른 스레드로 넘어가면 값이 공유되지 않습니다.
2. AsyncLocal<T> 개념과 특징
AsyncLocal<T>는 비동기/await 환경에서 로컬 상태를 유지하는 데 적합합니다. 스레드가 바뀌더라도 호출 컨텍스트에 데이터를 유지하기 때문에 비동기 메서드 체인 전체에 걸쳐 값이 유지됩니다.
private static AsyncLocal<int> _localValue = new AsyncLocal<int>();
public async Task DemoAsync()
{
_localValue.Value = 10;
await Task.Delay(100);
Console.WriteLine($"값: {_localValue.Value}"); // 10이 출력됩니다.
}
3. 언제 무엇을 써야 할까?
- [ThreadStatic]: 전통적인 멀티스레드 환경에서 각 스레드 별로 독립된 상태가 필요할 때
- AsyncLocal<T>: 비동기 프로그래밍 환경에서 흐름 컨텍스트에 따른 값을 저장하고자 할 때
간단히 말해, 비동기 메서드 내에서는 AsyncLocal<T>를 사용하는 것이 안전하며, 동기 멀티스레드 환경에서는 [ThreadStatic]으로 충분합니다.
'C#' 카테고리의 다른 글
| C# ReadOnlyMemory<T>와 메모리 안전성 확보 (0) | 2026.05.29 |
|---|---|
| C# IComparable과 IComparer를 이용한 정렬 로직 최적화 (0) | 2026.05.28 |
| C# ObservableCollection<T>와 UI 데이터 바인딩 (0) | 2026.05.28 |
| C# KeyedCollection<T>로 키 기반 컬렉션 설계 (0) | 2026.05.27 |
| C# 정적 메서드와 인스턴스 메서드 호출 성능 비교 (0) | 2026.05.27 |