이 질문은 여러 번 제기되었지만 여기에 나와있는 몇 가지 사항을 읽었 기 때문에 다시 질문하고 싶습니다. .NET CF와 관련이 있습니다.) 그리고 합리적인 특정 접근 방식에 대한 유효성 검사를 요청하고 사용자가 가질 수있는 피드백에 감사드립니다.스레드에서 발생하는 오류를 처리하는 표준 방법
어쨌든 상황은 모든 사람과 매우 비슷합니다. 스레드에서 발생하는 오류를 처리하고 싶습니다. 현재 스레드에서 예외를 throw하고 있기 때문에 현재 코드가 제대로 작동하지만 BeginInvoke 대신 Invoke를 사용하고 있습니다.
"지금 스레드를 만든 다음 Invoke를 호출하면 기능을 호출하지 않는 이유는 무엇입니까?"라는 질문에 대해 궁금 할 것입니다. 문제는 작업이 동기식인지 비동기식인지를 지정하는 매개 변수를 통해 호출자에게 유연성을 부여하려는 것입니다.
테스트로 비동기 작업 모드에서 테스트했으며 의도 한대로 자동으로 실패하고 응용 프로그램이 예외가 작업자 스레드에서 발생하는 시점에 디버거에서 종료됩니다.
나는 기본 스레드에서 예외의 행동에 대한 이해뿐만 아니라 disprove the statement in this question on SO (적어도 지금까지 .NET 3.5가 간다), I는 WPF 응용 프로그램에서 몇 가지 테스트 코드를 쓴 등이 있는지 확인하려면 :
을코드가 제거되었습니다.
다른 스레드에서 발생한 주 스레드의 이벤트를 처리 할 때 문제가 없어 보이는 것 같습니다.
위 테스트에 동의했다면 내 질문은 간단합니다. 모든 비즈니스 로직이 try/catch 블록으로 묶인 동기화 및 비동기 동작을 제공하는 내 메소드를 작성하는 것이 허용되는 방법입니다. ? 내부 오류가 스레드 내부에 갇히고 동기화 호출 인 경우 예외를 throw하고 비동기 호출 인 경우 이벤트를 발생 시키십시오. 위의 샘플 코드에서 이벤트를 발생시킨 후에도 예외가 발생합니다. 나는 이것이 왜 나에게 어떤 문제를 일으키는 지, 또는 왜 그런지 확실하지 않다.
Pseudo-pseudocode:
TestFunc(async);
private TestFunc(bool async)
{
try {
throw new MyAppException("error occurred.");
} catch(MyAppException ex) {
async ? RaiseErrorEvent : throw;
}
}
한스 말했듯이 나는 스레드에서 예외를 던질 경우, 그것은 상관없이 문제가 발생할 것
좋아, UPDATE - 기간. 나는이 사건을 시험해 볼 수 있었고, 예외는 던져졌고 F5를 친다면, 그것은 반복해서 던져지고 결코 실을 끝내지 않을 것이다. 이 특정 동작을 이해하지 못합니다. 디버거를 실행할 때 작동하는 방식일까요? 이것은 메소드가 동기화 또는 비동기라고 불리는 지 확인해야한다는 것을 의미합니다. sync 인 경우 오류가 발생합니다. 비동기 인 경우 이벤트를 발생시킵니다.
아마 더 나은 방법은 클라이언트가 항상 예외를 잡는 대신 이벤트로 오류를 처리하도록하는 것입니다. 누구나이 접근법에 대한 생각을 가지고 있습니까?
.NET 4.0의 Task에 대해 읽었으며 흥미로 웠습니다. 불행히도 내년 초까지는 4.0으로 업그레이드하지 않습니다. BeginX, EndX에 대한 귀하의 의견을 이해합니다. 이 방법을 사용하지 않는 이유는 내 GUI가 sync/async 메서드의 소비자가 될 수 있기 때문입니다. GUI에서는 명백한 이유로 비 블로킹이라고 부릅니다. 메서드를 호출하고 해당 메서드가 BeginX 다음에 EndX를 호출하면 본질적으로 차단됩니다. 그래서 BeginX 만 부릅니다. 이 경우에는 콜백을 사용할 수 있지만 대신 스레드가 종료되기 전에 이벤트가 발생하기를 기다리고 있습니다. – Dave
@Dave, IAsyncResult의 일반적인 사용 패턴은 콜백입니다. 콜백 내에서 작업을 종료하고 작업 중에 발생한 예외를 throw하도록 EndX()를 호출해야합니다. EndX()를 호출하지 않고도 BeginX()를 호출하는 것은 일반적으로 사용 오류로 간주되지만이 방법은 종종 준수되지 않습니다. 조언을 주신 덕분에 –
. 나는 그것을 시도 할 것이고 우리는 그것이 어떻게 작동하는지 보게 될 것이다. – Dave