2009-10-04 2 views
0

많은 장기 실행 절차를 수행하는 C#의 Windows Forms 응용 프로그램을 작성하고 있습니다. GUI가 잠기지 않도록 응용 프로그램을 프로그래밍해야합니다. 그것을 프로그래밍하는 가장 좋은 방법은 무엇입니까?비동기 Windows Forms 응용 프로그램을 프로그래밍하는 방법?

가 나는 다음과 같은 사용하는 방법을 알고 :

  1. BeginInvoke/EndInvoke
  2. 반복 Application.DoEvents()를 호출하면 (아마 좋은 생각)
  3. BackgroundWorker

그러나 콜 백 (call backs) 등으로 GUI 상태를 관리하는 방법은 사소하지 않습니다. . 이것을위한 해결책이 있습니까 (패턴 또는 라이브러리의 형태로)?

답변

1

Model-View-Controller pattern은 UI의 시각적 요소와 UI의 상태를 구분합니다. MVC 구현이 스레드를 인식하는 한 상태 관리 문제를 해결해야합니다.

이것은 멀티 스레드 UI 구현을 처리하는 방법입니다.

편집 : WinForms 프로젝트 용 MVC 구현을 선택하는 경우 good post입니다.

+0

아하 ... MVC는 무엇입니까. OK .. 많은 감사합니다. – Nestor

0

ThreadPool을 사용하여 UI에서 장기 실행 프로세스를 실행하는 것은 비교적 간단합니다. 피드백을 원할 경우, 장기 실행 프로세스의 특정 이벤트를 발생시키는 이벤트 핸들러를 사용할 수 있습니다. 이벤트 핸들러를 등록하고 필요에 따라 UI를 업데이트하십시오.

MVC가 좋지만 프로세스가 UI 스레드가 아닌 스레드에서 실행되고 있는지 확인해야합니다.

0

모든 옵션은 동일한 작업 (비동기 실행)을 수행하는 구문 설탕입니다. 다른 수준의 통제가있을 수 있습니다. GUI (메인 스레드에서 처리)가 항상 응답하기 때문에 BackgroundWorker를 사용할 것입니다.

2

BackgroundWorker을 사용하면 수행하려는 작업을 수행하는 가장 간단한 방법입니다. BackgroundWorker은 스레드 처리 논리를 단순화하여 작성해야하는 코드가 거의 없습니다.

  • 이제까지 당신의 장기 실행 방법 내부 UI를 업데이트하지 말라 : 당신은 세 가지 이벤트 (DoWork, ProgressChangedRunWorkerCompleted)를 처리하고 몇 가지 원칙을 따라야한다. 대신 ReportProgress을 호출하고 UI 로직에서 ProgressChanged 이벤트를 처리하십시오.
  • 작업자가 UI 스레드에서 실행되고 있지 않기 때문에 메서드가 throw하는 예외가 UI에 자동으로 표시되지 않는다는 점을 이해해야합니다. 그냥 자동으로 콘솔에 기록됩니다. 메서드가 완료되면 RunWorkerCompletedEventArgsError 속성을 확인하고 예외를 처리 (또는 throw)하는 것이 매우 중요합니다. 이렇게하지 않으면 방법이 실패했다는 것을 알 수 없습니다.
  • 메서드를 취소 할 수있는 경우 주기적으로 CancellationPending 속성을 확인하여 취소가 요청되었는지 확인해야합니다. 취소 된 경우 취소 처리가 완료되면 개체의 Cancel 속성을 설정합니다.CancellationPending은 true이고 Cancel은 false 일 수 있습니다. 예를 들어 사용자가 취소를 요청하고 메서드가 CancellationPending을 확인할 기회가 있기 전에 완료 될 때이 문제가 발생합니다.
  • 해당하는 경우 RunWorkerCompleted 이벤트 처리기에서 Cancel을 확인하면 UI가 작업자가 실행되는 동안 발생한 상황에 대한 적절한 응답을 제공 할 수 있습니다.

설명서의 예제는 모두 양식의 메서드를 호출하는 DoWork 이벤트 처리기를 보여줍니다. 이것은 거의 당신이하고 싶은 것이 아닙니다. 비즈니스 논리를 UI와 분리하는 것이 일반적으로 좋은 생각입니다. 백그라운드 작업에서는 필수적입니다. 장기 실행 메소드가 UI가 존재한다는 것을 모르는 클래스의 멤버 인 경우 부주의로 인해 상태 표시 줄 등을 업데이트하는 메소드를 호출 할 위험이 없습니다.

관련 문제