상세 컨텐츠

본문 제목

[C# Thread] 매개변수 전달하는 2가지 방법 – ParameterizedThreadStart vs Lambda

<개인공부>/[C#]

by 데브수달 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
반응형

관련글 더보기