2012-06-22 5 views
3

일부 이벤트를 설정하고 종료되기 전에 이벤트가 발생할 때까지 기다릴 필요가있는 앱이 있습니다. 가장 좋은 방법은 무엇입니까? Thread.Sleep은 잠자고 있어도 이벤트를 처리 할 수 ​​없다는 사실을 포함하여 여러 가지 이유로 좋지 않은 선택입니다. 분명히 while 루프가없는 CPU 사이클을 낭비하지 않을 것입니다. 그렇다면 콘솔 앱이 불확실한 시간 동안 종료되지 않도록 이벤트를 처리 할 수있는 가장 간단한 방법은 무엇입니까?이벤트를 기다리는 동안 내 프로그램이 끝나지 않게하는 올바른 방법은 무엇입니까

궁극적으로 이것은 이것이 문제가되지 않는 서비스가 될 것입니다.하지만 지금은 첫 번째 반복에서 콘솔 앱에서 일부 코드를 테스트하는 것입니다. 실제 서비스로 (전에 서비스를 만들지 않았기 때문에 내 코드가 다음 단계를 복잡하게 만들지 않도록 확실히하고 싶습니다.) 필자가이 글을 쓰면서 필자는 WinForms 앱에서 대신 테스트해볼 수 있다는 것을 깨달았습니다. 그러면 문제가 해결 될 것입니다.

+5

어떤 종류의 이벤트에 대해 이야기하고 있으며 어떤 종류의 응용 프로그램입니까? 우리에게 더 많은 맥락을 줄 수 있다면 정말 도움이 될 것입니다. –

+0

[ManualRaiseEvents] (http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx) – dvvrd

+0

WaitHandle.WaitAll에 대한 MSDN 예제와 비슷한 것이 있습니까? http://msdn.microsoft.com/en-us/library/z6w25xa6.aspx – dash

답변

1

콘솔 응용 프로그램으로도 실행 및 디버깅 할 수있는 서비스를 작성하려면 this을 빌드했습니다.

"더 복잡하게 만든다"라는 접근 방식은 나에게도 도움이되지 못했습니다.

1

좋은 옵션은 ManualResetEvent입니다. 이렇게하면 잠자 지 않고 이벤트가 설정되기를 기다리는 동안 차단할 수 있습니다. 콘솔 응용 프로그램의 메인 루틴은 ManualResetEvent에서 WaitOne()으로 전화 할 수 있습니다. 일상 생활이 끝나면 ManualResetEvent.Set()으로 전화하면 콘솔 응용 프로그램을 종료 할 수 있습니다.

이벤트 콜렉션을 기다려야하는 경우 CountdownEvent이 또 다른 옵션입니다. AddCount()Signal으로 전화하여 필요에 따라 개수를 늘리거나 줄일 수 있습니다.

+0

나는 이것이이 일을 할 것이라고 생각했지만, 이것이 차단되어있는 동안 계속해서 더 많은 수신 이벤트를 처리 할 수 ​​있다고 생각하지 않는다. 적어도 지금은 내 테스트에 나타나지 않았다. –

+0

@BrandonMoore 다른 스레드를 다루는 경우에는 정상적으로 작동합니다. 그러면 주 스레드가 차단되고 다른 스레드는 이벤트 설정을 처리해야합니다. –

+0

사실 메인 스레드는 들어오는 이벤트를 처리하기 위해 새로운 스레드를 전달합니다. 그렇다면 WinForms 앱의 기본 GUI 스레드에서이 작업을 수행하여 버튼 클릭 이벤트와 같은 제어 이벤트를 처리하지 못하게 할 수 있습니까? 지금까지는 내 테스트에서 나에게 줄 것 같았지만 아마도 내가가는대로 증분 테스트없이 평소보다 훨씬 많은 코드를 작성 했으므로 코드에 뭔가 다른 점이있을 수 있습니다. –

관련 문제