EndInvoke不会检索任何内容

时间:2014-05-21 14:23:24

标签: vb.net begininvoke

我有一个需要在UI线程上调用的UI方法 因此,我通过另一个帖子中拥有它的表单控件上的BeginInvoke来调用它:

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块中并返回异常对象,以便我可以使用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方法正确返回(在调试器中看到),我也得到Nothingnull)。

对此有何帮助? (不要介意VB或C#,我对两者都没有任何问题)

1 个答案:

答案 0 :(得分:0)

.NET委托类型是不变的,但从方法组转换为委托类型时,方差确实适用。

特别是,实际方法的返回类型可以是委托类型合同承诺的返回类型的子类,并且所有方法类型都与返回void的委托类型兼容。在这种情况下,调用者接收的内容取决于委托的正式返回类型,而不是绑定方法。这对于EndInvoke几乎不重要,它会将所有结果都转换为对象,除非声明委托返回void,在这种情况下EndInvoke返回null