簡體   English   中英

VB.NET中事件的GetInvocationList

[英]GetInvocationList of an event in VB.NET

我正在嘗試通過遵循WCF應用程序(來自Sacha Barber)的示例來學習一些WCF原則。

現在我想將以下函數轉換為VB.NET

private void BroadcastMessage(ChatEventArgs e)
{

    ChatEventHandler temp = ChatEvent;

    if (temp != null)
    {
        foreach (ChatEventHandler handler in temp.GetInvocationList())
        {
            handler.BeginInvoke(this, e, new AsyncCallback(EndAsync), null);
        }
    }
}

但是我遇到了一些問題,因為編譯器不接受以下代碼

Private Sub BroadcastMessage(ByVal e As ChatEventArgs)

    Dim handlers As EventHandler(Of ChatEventArgs) = ChatEvent

    If handlers IsNot Nothing Then

        For Each handler As EventHandler(Of ChatEventArgs) In handlers.GetInvocationList()

            handler.BeginInvoke(Me, e, New AsyncCallback(AddressOf EndAsync), Nothing)

        Next

    End If

End Sub

它說

公共共享事件ChatEvent(sender As Object,e As ChatEventArgs)'是一個事件,不能直接調用

接下來是否有可能在VB.NET中獲取以某種其他方式鏈接到某個事件的處理程序?

使用ChatEventEvent(或EventName事件)

它不會出現在intellisense中,但它的成員會。

VB.NET在幕后創建一個變量,以隱藏編碼器的復雜性......

這僅在聲明事件的類(或可能是其后代)中可用

您可能嘗試在類中聲明此代碼,該類是聲明ChatEvent事件的類的后代。 這是不可能的,因為事件只能在聲明它們的類中被視為變量(包括調用它們)。 這是因為event關鍵字實際上向編譯器指示它需要執行一些幕后轉換。

怎么了

考慮這個聲明:

Public Event MyEvent as EventHandler

很簡單吧? 然而,實際上這是做什么的(你只是看不到它)

Private compilerGeneratedName as EventHandler

Public Event MyEvent as EventHandler
    AddHandler(ByVal value as EventHandler)
        compilerGeneratedName += value
    End AddHandler
    RemoveHandler(ByVal value as EventHandler)
        compilerGeneratedName -= value
    End RemoveHandler
    RaiseEvent(ByVal sender as Object, ByVal e as EventArgs)
        compilerGeneratedName.Invoke(sender, e)
    End RaiseEvent
End Event

當你調用這個事件時:

RaiseEvent MyEvent(Me, EventArgs.Emtpy)

它實際上調用了RaiseEvent塊中的代碼。

編輯

如果VB.NET中的事件不能在任何地方被視為變量(它們可以被視為C#中聲明類中的變量,這就是您的C#示例編譯的原因),那么您必須自己明確地實現該事件。 有關如何執行此操作的詳細信息,請參閱Event語句中MSDN頁面 總而言之,您需要一些方法來存儲多個事件處理程序(或者使用單個事件處理程序以及GetInvocationList ,正如您現在嘗試的那樣)。 AddHandlerRemoveHandler代碼塊中,您將分別添加和刪除事件處理程序列表。

你可以使用這樣的東西:

Private myEventList as New List(Of EventHandler)

Public Custom Event MyEvent as EventHandler
    AddHandler(ByVal value as EventHandler)
        myEventList.Add(value)
    End AddHandler
    RemoveHandler(ByVal value as EventHandler)
        myEventList.Remove(value)
    End RemoveHandler
    RaiseEvent(ByVal sender as Object, ByVal e as EventArgs)
        For Each evt in myEventList
           evt.BeginInvoke(sender, e, New AsyncCallback(AddressOf EndAsync), Nothing)
        Next
    EndRaiseEvent
End Event

所以現在,如果你打電話

RaiseEvent MyEvent(Me, EventArgs.Emtpy)

它將以您期待的方式提升活動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM