C# 반복 작업 Thread 구현 질문

            _threadPauseEvent = new ManualResetEvent(false);
            _threadExitEvent = new ManualResetEvent(false);   

        private void ThreadFunction()
        {
            while (WaitHandle.WaitAny([_threadPauseEvent, _threadExitEvent]) == 0)
            {
                         // 반복 또는 순차적인 작업
                Thread.Sleep(~);
            }
        }

C++에서 WaitForMultiObjects를 사용하듯이
단순히 반복 또는 순차적인 작업 스레드를 만들 때 위처럼 구현하여
종료 일시정지 재개 를 구현하곤 하는데
WaitHandle.WaitAny 에 대한 오버헤드가 혹시 있을까 해서 작성할 때 마다 망설여 집니다…
위와 같은 방식보다 혹시 더 효율적인 방법이 있을까요?

2 Likes

위와 같이 코딩시 WaitAny 호출에서 매 번 새 배열을 할당하므로.

ManualResetEvent e1 = new(false), e2 = new(false);
WaitHandle[] waits = [e1, e2];
while(WaitHandle.WaitAny(waits))
{
    // ...
}

Wait 배열을 반복문 바깥으로 이동하는 것이 좋을 것 같습니다.

참고로 WaitAny은 내부적으로 WaitForMultiObjects을 호출하는 것으로 알고 있습니다.

3 Likes

@hyeonjin 님 과 @tkm 코드 모두 새로운 문법이 적용되어 있어서 좋습니다.

본문에서는 WaitHandle.WaitAny() 였지만… 만약 WaitAll()인 경우 그냥

...
e1.WaitOne();
e2.WaitOne();
...

이 가장 좋을 것 같고, WaitAny()@tkm 님 방식이 힙할당을 최소화 할 테니까 맞는 것 같아요.

1 Like

아 답변의 WaitAll은 오타입니다 수정했습니다.
말씀주신 방법은 timeout을 설정하지 않을 경우에는 유용할것 같습니다.
while문에 사용하는 경우에는 보통 timeout을 동반하기에 WaitAll을 사용하는 것이 맞고요

2 Likes