У меня есть метод пользовательского интерфейса, который нужно вызвать в потоке пользовательского интерфейса.
Поэтому я называю это через BeginInvoke
на элементе управления, который им владеет, из другого потока: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
блоке и возвращает исключение объект таким образом я могу получить его с 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)
Дело в том, что я получаю Nothing
(null
), даже если исключение было выбрано и правильно возвращено (показано в отладчике) с помощью метода пользовательского интерфейса.
Любая помощь по этому поводу? (Не обращайте внимание на VB или C#, у меня нет проблем с пониманием того и другого)
Просьба показать декларацию для OpenDocForReportDelegate –
Переходы 'BeginInvoke' и' EndInvoke' возвращаются назад? Почему бы просто не использовать 'Invoke'? –
@JonSkeet имеет правильный ответ! Делегат имел старую версию (метод был изменен после ее написания) и не возвращал Exception! – Teejay