2010-02-10 5 views
3

나는 길고 상세한 질문을 썼지 만 간단한 질문에 찬성하여이 질문에 답을 찾지 못했습니다.WF를 사용하는 멀티 스레드 응용 프로그램의 오류 처리 패턴은 무엇입니까?

간단한 응용 프로그램 설명 :

나는 여러 스레드를 생성합니다 WPF 응용 프로그램을 가지고 있고, 각 스레드는 자신의 WF를 실행합니다. GUI에서 사용자 상호 작용을 허용하는 스레드 및 WF의 오류를 처리하는 가장 좋은 방법은 무엇입니까? 쓰레드가 종료되기를 원하지 않기 때문에 쓰레드에서 저레벨 예외를 처리 할 계획이다. 질문

요약 :

  1. 어떻게 WF하고 시작하는 스레드 사이의 통신을 구현? WorkflowTerminated가 있지만 워크 플로를 종료하지 않으려면 문제를 해결하고 계속 진행해야합니다. 유일한 옵션은 FaultHandler를 사용하는 것으로 가정하고 있지만 액티비티 블록을 사용하지 않고도 수행 할 수있는 다른 방법이 있는지 궁금해하고 있습니다. 나는 아직 발견하지 못한 프레임 워크가 있기를 바라고 있습니다.

  2. WF의 오류는 스레드에 의해 발견되어 GUI에 오류를 표시해야합니다. 그런 다음 사용자는 복구에 대한 논리적 선택을 한 다음 스레드로 다시 전송 한 다음 WF로 보냅니다. 다시 말하지만, 제가 거기를 살펴 봐야 할 부분이 있습니까?

내가 설명하는 것을 달성하는 유행어/키워드조차도 실제로 도움이 될 수 있으며, 각 연구에 대한 다리 작업을 수행 할 수 있습니다. 그러나 추가적인 통찰력은 언제나 환영합니다. :)

답변

0

다음은이 문제를 해결하는 방법입니다. 하지만 작은 배경 정보 :

사용자는 캔디 패키지 도구가 실행을 시작하게하는 GUI의 버튼을 클릭합니다. 이는 ViewModel에서 명령 바인딩을 통해 수행되며, ViewModel은 모델에서 하위 수준의 함수를 호출합니다. 모델의 함수는 스레드를 시작하고 상태 시스템을 실행합니다.

어느 시점에서 기계가 작동하지 않습니다. 그럴 때 오류 및 가능한 (알려진) 복구 방법에 대한 정보를 컴파일합니다. 이 객체를 객체에 넣은 다음 콜백 인터페이스를 통해 GUI로 전달합니다. 그 동안 작업자 스레드는 이벤트가 설정 될 때까지 대기합니다.

결국 캔디 작업자는 오류를 확인하고 시스템에 수행 할 작업을 알려주는 버튼을 클릭합니다. 1) 복구 방법 중 하나를 기본 설정으로 표시하고 2) 이벤트를 설정합니다. 이제 작업자 스레드는 계속해서 기본 오류 복구 방법을 확인하고 상태 시스템의 해당 상태로 전환합니다.

매우 잘 작동합니다 (지금까지). 내가 아는 부분은 절름발이입니다. 기본 오류 복구 방법을 확인하는 방식입니다.근본적으로 문자열 변수를 설정하고이 문자열을 알려진 문자열 목록과 비교합니다. 울트라 불구하고,하지만 열거를 사용하는 이외의 더 좋은 방법이 있는지 모르겠습니다. 누구든지 나를 위해 권장 사항이 있습니까?

1

멀티 스레드 WPF 응용 프로그램에서 나에게 도움이 된 것은 오류 스레드가 예외 및 기타 정보를 다시 UI 스레드로 전달하는 콜백 메소드를 호출하도록하는 것입니다. 콜백은 반환 값을 가질 수 있으므로 사용자가 응답 할 때까지 대기하는 동안 스레드가 차단 될 수 있으면 해당 스레드가 작동 할 수 있습니다. 콜백은이를 호출하는 스레드에서 실행되므로 모든 UI 업데이트는 컨트롤의 디스패처를 통해 수행되어야 함을 기억하십시오. 여러 스레드가 동시에 예외를 throw 할 수있는 경우 모든 스레드가 동일한 콜백을 사용하는지, 어떤 종류의 동기화가 필요한지 결정해야합니다.

+0

사용자 응답을 기다리는 동안 스레드가 확실히 차단되어야합니다 (자체적으로). GUI가 적절한 신호를 설정할 때까지 스레드 차단을 만들기 위해 WaitHandle 및 AutoResetEvent를 사용할 것을 고려하고있었습니다. 스레드에서 "나는 오류를 처리했습니다"이벤트를 생성하고이를 콜백을 통해 GUI에 전달하는 적절한 방법이 있습니까? 콜백이 아닌 다른 것을 처리 할 수있는 ".NETish"방법이 있습니까? 나는 확실히 이런 방식으로 편안하게하고 있지만, 다른 접근 방식에도 열려 있습니다. – Dave

+0

".NETish way"를 정의하는 방법을 잘 모르겠습니다. (좋은 일반적인 질문입니다). –

+0

그러나 사용자가 응답 할 스레드를 선택할 수 있도록 각 스레드의 상태를 UI (목록보기 포함)에 동시에 표시하는 방식을 사용합니다. 콜백은 비동기 적으로 신호를 보낼 때 가장 선호하는 방식이며 여러 .Net 라이브러리에서 사용됩니다. 더 호기심 많은 대답을 기다리는 동안 한 번 시도해보십시오. –

관련 문제