VB.NET разъяснение кода делегата - PullRequest
0 голосов
/ 01 октября 2009

Я пытаюсь выяснить, что делает этот кусок кода. Это часто ошибки (не в ущерб системе), но достаточно, чтобы это беспокоило меня. Было бы здорово, если бы я мог получить больше информации о том, что именно здесь происходит, и любые предложения о том, как я мог бы это исправить / предотвратить.

код

Public Shared Sub Fire(ByVal thisEvent As [Delegate], _
    ByVal ParamArray args() As Object)

    If (thisEvent Is Nothing) Then
        Exit Sub
    End If

    Dim delegates() As [Delegate] = thisEvent.GetInvocationList()

    For Each synch As [Delegate] In delegates
        Try
            synch.DynamicInvoke(args)
        Catch ex As System.Exception
            Util.utEmail.SendErrorMail("Async event fire error.", ex) //Email out error
        End Try
    Next
End Sub

Распространенная ошибка

Сообщение пользователя: ошибка запуска асинхронного события.
Тип ошибки: System.Reflection.TargetInvocationException
Сообщение об ошибке: Исключение было сгенерировано целью вызова.
Расположение ошибки: System.Reflection.TargetInvocationException: Исключение было сгенерировано целью вызова. ---> System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.
at System.Windows.Forms.Control.MarshaledInvoke (элемент управления, метод делегата, аргументы Object [], логическое синхронное значение)
в System.Windows.Forms.Control.Invoke (метод Delegate, Object [] args)
в TSG.TransIT.UI.UIControls.ctGPViewTrip.updateTrip ()
в TSG.TransIT.UI.UIControls.ctGPViewTrip.handleEditTrip (Отправитель объекта, EditTripAnnouncementEventArgs e)

1 Ответ

1 голос
/ 01 октября 2009

Что происходит, вы вручную вызываете многоадресного делегата. Обычно я бы не рекомендовал это (намного проще просто вызвать делегата и позволить ему беспокоиться обо всем этом), но похоже, что вы делаете это для улучшения регистрации приложений и обработки ошибок. Для этого может быть, а может и нет веская причина, и поэтому я оставлю остальную часть своей речи «просто вызови это» на другое время.

Проблема здесь в том, что это звучит так, как будто это работает в потоке, отличном от некоторых целей вызова, и это означает, что к тому времени, когда этот код вызывает делегата с определенной целью, цель может больше не существовать или необходим объект вызванным кодом может больше не существовать.

...