2014-05-21 3 views
0

UI 스레드에서 호출해야하는 UI 메서드가 있습니다.EndInvoke가 아무것도 검색하지 않습니다.

Dim currProjForm As Form_Project_Contaner = HomeForm.GetActiveProject() 
Dim asyncOpDlg As [Delegate] = New OpenDocForReportDelegate(AddressOf currProjForm.OpenDocForReport) 
currProjForm.BeginInvoke(asyncOpDlg, documentId, revisionId, exportProvider) 

하는 메소드가 예외를 던질 수있는, 그래서 Try...Catch 블록의 코드를 포장하고 예외를 반환하기로 결정
그러므로 나는 다른 스레드에서, 그것을 소유하는 폼 컨트롤에 BeginInvoke 통해 전화 오브젝트 나는 EndInvoke으로 검색 할 수 있도록 :

Public Function OpenDocForReport(ByVal documentId As Int32, 
           ByVal revisionId As Int32, 
           ByVal exportProvider As IExportProvider) As Exception 

    Try 
     '...statements... 
    Catch ex As Exception 
     Return ex 
    End Try 
    Return Nothing 

End Function 

Dim asyncOpToken As IAsyncResult = currProjForm.BeginInvoke(asyncOpDlg, documentId, revisionId, exportProvider) 
Dim asyncOpRet = currProjForm.EndInvoke(asyncOpToken) 

UI 메서드에서 예외가 발생하여 디버거에서 올바르게 반환 된 경우에도 실제로 Nothing (null)이 표시됩니다.

어떤 도움이 필요합니까? (VB 또는 C#에 대해 신경 쓰지 않아도됩니다.)

+2

OpenDocForReportDelegate에 대한 선언문을 표시하십시오. –

+2

'BeginInvoke'와'EndInvoke' 호출이 서로 뒤로 돌아가고 있습니까? 왜'Invoke'를 사용하지 않을까요? –

+0

@JonSkeet이 정답입니다! 대리인은 이전 버전이었고 (작성된 후에 메서드가 수정되었습니다) 예외를 반환하지 않았습니다! – Teejay

답변

0

.NET 대리자 형식은 변하지 않지만 메서드 그룹에서 대리인 형식으로 변환 할 때는 분산이 적용됩니다.

특히 실제 메서드의 반환 형식은 대리자 형식에 의해 계약 상 약속되어있는 반환 형식의 하위 클래스가 될 수 있으며 모든 메서드 형식은 void을 반환하는 대리자 형식과 호환됩니다. 이 경우 호출자가받는 것은 바인딩 된 메서드가 아니라 대리자의 정식 반환 형식에 따라 달라집니다. 위임자가 void을 반환하도록 선언하지 않는 한 EndInvoke은 거의 모든 결과를 객체로 캐스팅하지 않으며이 경우 EndInvokenull을 반환합니다.

+0

이것을 수락하십시오. 사실 @ 존스 스케 (JonSkeet)는 나에게 첫 번째 옳은 대답을 주었지만, 그는 단지 의견을 남겼다. – Teejay

관련 문제