2014-09-11 1 views
1
I은 ​​다음 도메인 드로잉 같이 관련된 어떤 클래스를 갖는

:반환 부가 그들 사이의 관계를 C#

MyClass has the responsibility of both classes Requestcontroller 온받은 스레드 풀에서 루프를 실행

메시지는 그것들을 처리하고 FooClass의 몇 가지 메소드를 호출합니다. 어떤 메소드가 잘못되면 예외를 던져야합니다.

예에서 (어떤 방법으로 의사 코드) :

class RequestController 
{ 
    private FooClass fooClass; 

    public RequestController(ref FooClass fooClass) 
    { 
     this.fooClass = fooClass; 
    } 

    void OnResponseReceived() 
    { 
     try 
     { 
      this.fooClass.ProcessingRequest("id", "requestType", 13); 
     } 
     catch(Exception ex) 
     { 
      Debug.Fail(ex.Message); 
     } 
    } 
} 


class FooClass 
{ 
    private object myObj; 
    [...] 

    public void ProcessingRequest(string id, string type, int count) 
    { 
     try 
     { 
      myObj.MethodAsync(id, type, RequestFailedCB, myObj); 
      //This method throws an Exception, that I want to be handled by RequestController class based on the Exception 
     } 
     catch(Exception) 
     { 
      throw; 
     } 
    } 
} 

그래서, 내 문제는 비동기 방식 (FooClass에서 MethodAsync가) 실패와 FooClass에서 예외가 발생하지만, 그것은 나를주고 것입니다 "예외 처리". 내가 원하는 것은 RequestController가 FooClass의 메소드를 호출하고, FooClass.ProcessingRequest에서 호출 된 비동기 메소드가 실패하고 내 RequestController가 반응해야하는 예외를 throw하고 시스템에서 더 이상 메시지를 보내는 경우이다. 수신 된 응답에 오류가 있음을 나타냅니다.

ProcessingRequest as 및 Callback 메서드를 만드는 것이 좋습니까? 아니면이 목적을 해결할 더 좋은 방법이 있습니까 ???

편집 : @ KC-NH 복잡한 코드의 페이지를 게시하지 않고도 요점에 더 가깝게하려고 노력할 것입니다. 내가 언급 한 것을 잊어 버렸습니다. 그리고 FooClass 메소드에 게시 된 예제는 실제로 UCMA 4 API의 .BeginTransfer를 호출합니다.이 API는 실패한 경우 잡아두고, RequestController가 시스템의 실패에 대한 메시지를 더 보내도록합니다. .BeginTransfer 메서드는 IAsyncResult를 반환하고 매개 변수 중 하나로서 콜백이 필요합니다. 시스템이 throw하는 예외는이 CB 내부에 있지만 콜백에서 해당 예외를 throw하려고하면 "처리되지 않은 예외"가 발생합니다. 콜백이 예외를 throw 할 위치를 알 수 없으 리라는 것이 무엇입니까 ??

+0

이름을 기반으로, 나는이 문제가 MethodAsync와 RequestFailedCB에 있다고 생각합니다. 코드를 게시 할 수 있습니까? –

+0

@ KC-NH 지금 당신이 충분한 코멘트를 얻었습니다. 이 방법으로 좋은 코멘트입니다 :) – BradleyDotNET

답변

1

[.NET 4.5 특정 솔루션]

당신이해야 항상 await 비동기 호출. await은 예상대로 예외를 다시 발생시킵니다. 이렇게하면 문제가 해결됩니다.

class RequestController 
{ 
    private FooClass fooClass; 

    public RequestController(ref FooClass fooClass) 
    { 
    this.fooClass = fooClass; 
    } 

    public async void OnResponseReceived() 
    { 
    try 
    { 
     await fooClass.ProcessingRequest(); 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.Fail(ex.Message); 
    } 
    } 
} 

public class FooClass 
{ 
    private object myObj; 

    public async Task ProcessingRequest() 
    { 
    await myObj.MethodAsync(id, type, RequestFailedCB, myObj); 
    } 
} 
+0

내 타겟 프레임 워크는. 넷 말할 깜빡 4.잘못된 것이 아니라면 Async 키워드는 .net 4.5 이상에만 포함됩니까? – grmihel

+0

OK, 죄송합니다. 너무 익숙합니다.) MethodAsync 구현의 일반적인 구조를 게시 할 수 있습니까? –

+0

기본 게시글을 (잘하면) 더 자세히 설명하도록 업데이트했습니다. – grmihel

0

오늘 제 동료 중 한 사람과 이야기했습니다. 그는 FooClass 내 콜백 메소드에서 catch 된 예외 이벤트를 발생시키기 위해 EventHandler를 사용한다고 제안했습니다. 그래서 해결책은 다음과 같습니다

  1. FooClass RequestFailedCB는 예외가 사로 잡았됩니다 RequestFailedCB에서 예외
  2. 을 던져, 내 이벤트 핸들러에 의해 ErrorEvent을 제기.
  3. RequestController는 이제 이벤트가 발생했다는 정보를 얻습니다.
  4. RequestController는 EventArgs 및 보낸 사람 개체를 기준으로 이벤트에서 발생하는 오류를 처리하므로 시스템에서 해당 오류를 더 이상 보낼 수 있습니다.

문제 해결 :) 모든 입력에 감사드립니다.

+0

게시물 업데이트를 기반으로, (Tasks) 래퍼 (.NET 4.0 TPL 비동기 사용)를 사용하도록 제안하려고했습니다. APM 호출을 '작업'으로 래핑하면 예외를 쉽게 관리 할 수 ​​있습니다. 아직도 세부 사항을 원한다면 알려주세요. –

관련 문제