2008-09-17 8 views
15

이벤트는 C#에서 동기식입니다. 내 기본 양식이 스트림을 수신 대기하는 루프가있는 스레드를 시작하는이 응용 프로그램이 있습니다. 스트림에서 어떤 것이 나오면 루프에서 기본 폼으로 이벤트가 시작됩니다.C에서 비동기 이벤트를 만드는 가장 좋은 방법 #

기본 양식의 속도가 느리거나 메시지 상자가 표시되면 루프가 일시 중지됩니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 콜백을 사용하고 기본 폼에서 호출?

답변

3

흠, 나는 그 때 내가 필요로하는 것에 의존하는 여러 가지 시나리오를 사용했습니다.

저는 BeginInvoke가 거의 다 왔기 때문에 코드 작성이 가장 쉽다고 생각합니다. 어쨌든 당신은 Invoke를 이미 사용해야하므로 BeginInvoke로 변경하십시오. 별도의 스레드에서 콜백을 사용하면 BeginInvoke를 사용할 때와 마찬가지로 스레드 풀을 사용하여 콜백을 큐에 넣는 것과 동일한 작업을 수행 할 수 있습니다.

+0

이것은 내 응용 프로그램과 가장 잘 어울리 며 백그라운드 작업에 루프를 던져서 내가 처리하고 싶은 방식에 맞지 않습니다. –

+0

EndInvoke도 사용하는 것을 잊지 마세요. 그렇지 않으면 호출 된 메서드의 예외가 throw되지 않습니다. – dmigo

8

양식을 사용하고 있으므로 더 쉬운 방법은 BackgroundWorker 구성 요소를 사용하는 것입니다.

BackgroundWorker 구성 클래스는 은 별도의 전용 스레드에서 작업을 실행할 수 있습니다. 시간이 많이 걸리는 작업 (다운로드 및 데이터베이스 ) 트랜잭션 이 (가) 실행 중일 때 이 응답을 중지 한 것처럼 보일 수 있습니다. 반응 형 UI 인 을 원할 때 이러한 작업과 관련된 지연이 길어질 경우 BackgroundWorker 클래스는 편리한 솔루션을 제공합니다.

+0

BackgroundWorker가 가장 훌륭하고 깨끗한 방법입니다. –

0

당신은 몇 가지 옵션이 있습니다. 이미 경험했지만, 사용하기 쉽기 때문에 위임자와 BeginInvoke를 떠나서 BackgroundWorker (v2.0 이상)를 사용하는 것이 좋습니다. 스레드의 완료시 기본 폼과 상호 작용할 수도 있습니다. 모두 매우 실용적인 솔루션으로 구현되었습니다.

0

System.ComponentModel.BackgroundWorker은 실제로 좋은 출발점입니다. 비동기 작업을 수행하고 중요한 이벤트에 대한 알림을 제공하며 양식과보다 잘 통합 할 수있는 방법을 제공합니다.

예를 들어 ProgressChanged 이벤트에 대한 처리기를 등록하여 진행률 알림을 활성화 할 수 있습니다. (길고 비동기적인 프로세스가 있고 사용자가 응용 프로그램이 멈춘 것으로 생각하지 않으려면 적극 권장합니다.)

관련 문제