<개인공부>/[C#]
[C# Thread] 매개변수 전달하는 2가지 방법 – ParameterizedThreadStart vs Lambda
데브수달
2025. 5. 17. 15:15
728x90
반응형
C#에서 Thread는 매개변수를 받지 않는 메서드만 사용할 수 있기 때문에, 매개변수를 함께 전달하고 싶을 때는 ParameterizedThreadStart 또는 **lambda 식**을 활용해야 합니다.
✅ 해결 방법 1: ParameterizedThreadStart 사용하기
✅ 사용 조건:
- 반드시 object 하나만 인자로 받을 수 있음
- 내부에서 캐스팅 처리 필요
void SignalToCsvWithParam(object obj)
{
string msg = obj as string;
// 예: CSV 파일 저장 처리
File.AppendAllText("output.csv", $"{DateTime.Now}, {msg}\n");
}
// 사용
Thread t = new Thread(new ParameterizedThreadStart(SignalToCsvWithParam));
t.IsBackground = true;
t.Start("RALARM|222");
✅ 해결 방법 2: 람다로 클로저 처리 (권장 방식)
✅ 장점:
- 명확한 타입 유지
- 여러 인자를 클로저로 캡처 가능
- 함수 분리 없이 간결한 코드 작성 가능
string msg = "RALARM|222";
Thread t = new Thread(() =>
{
File.AppendAllText("output.csv", $"{DateTime.Now}, {msg}\n");
});
t.IsBackground = true;
t.Start();
✅ 기타: Task로도 처리 가능 (비동기 처리를 명시할 경우)
string msg = "RALARM|222";
Task.Run(() => {
File.AppendAllText("output.csv", $"{DateTime.Now}, {msg}\n");
});
✍️ 실무 팁
SocketServer처럼 통신 이벤트에서 메시지를 실시간으로 받아 처리하는 경우, 매번 새로운 쓰레드 생성보다는 BlockingCollection + 소비자 스레드 패턴을 사용하는 것이 안정적입니다.
* 데이터 수신부와 저장부를 완벽히 분리하여 스레드 안정성과 성능 유지가능하다.
BlockingCollection<string> _queue = new BlockingCollection<string>();
void StartCsvWriter()
{
Thread csvWriter = new Thread(() =>
{
foreach (var msg in _queue.GetConsumingEnumerable())
{
File.AppendAllText("output.csv", $"{DateTime.Now}, {msg}\n");
}
});
csvWriter.IsBackground = true;
csvWriter.Start();
}
// 통신 데이터 수신 시 호출
_queue.Add("RALARM|222");
728x90
반응형