2014-05-21 6 views
0

У меня есть метод пользовательского интерфейса, который нужно вызвать в потоке пользовательского интерфейса.
Поэтому я называю это через 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#, у меня нет проблем с пониманием того и другого)

+2

Просьба показать декларацию для OpenDocForReportDelegate –

+2

Переходы 'BeginInvoke' и' EndInvoke' возвращаются назад? Почему бы просто не использовать 'Invoke'? –

+0

@JonSkeet имеет правильный ответ! Делегат имел старую версию (метод был изменен после ее написания) и не возвращал Exception! – Teejay

ответ

0

Типы делегатов .NET являются инвариантными, но при преобразовании из группы методов в тип делегата применяется дисперсия.

В частности, тип возвращаемого значения фактического метода может быть подклассом типа возврата, по договору, обещаемым типом делегирования, и все типы методов совместимы с типом делегирования, который возвращает void. В таком случае то, что получает вызывающий абонент, зависит от формального типа возврата делегата, а не от связанного метода. Это вряд ли имеет значение с EndInvoke, который в любом случае выводит все результаты как объект, если делегат не объявлен для возврата void, и в этом случае EndInvoke возвращает null.

+0

Принимая это. На самом деле @JonSkeet дал мне первый правильный ответ, но он оставил комментарий. – Teejay

Смежные вопросы