我有一个需要在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方法正确返回(在调试器中看到),我也得到Nothing
(null
)。
对此有何帮助? (不要介意VB或C#,我对两者都没有任何问题)
答案 0 :(得分:0)
.NET委托类型是不变的,但从方法组转换为委托类型时,方差确实适用。
特别是,实际方法的返回类型可以是委托类型合同承诺的返回类型的子类,并且所有方法类型都与返回void
的委托类型兼容。在这种情况下,调用者接收的内容取决于委托的正式返回类型,而不是绑定方法。这对于EndInvoke
几乎不重要,它会将所有结果都转换为对象,除非声明委托返回void
,在这种情况下EndInvoke
返回null
。