2

外部クラスを使用して、リモートアプリケーションへの接続を開きます。このクラスは、ハンドラーを介して処理されるリモートアプリケーションからデータを受け取ります。

このハンドラーに、別々のメソッドでデータを解析するためのいくつかのチェックを追加しました。ただし、オブジェクトに再度アクセスする必要があり、そのオブジェクトのメソッドを呼び出すイベントがトリガーされた時点でスタックしています。これはかなり基本的な質問だと思いますが、私はOOPから始めたばかりです。

public static void Main(string[] args) {
    IBattleNET b = new BattlEyeClient(loginCredentials);
    b.MessageReceivedEvent += HandleMessage;   
    b.Connect();
} 

private static void HandleMessage(BattlEyeMessageEventArgs args) {
    //call a method to analyze data parse
    PlayerList(args.Message);
}

private static void parsePlayerList(string playerList) { 
    // At this point I need to access the object b again to to call a method
}
4

3 に答える 3

1

通常、イベントは署名に 2 つのパラメーターを持つデリゲートを使用します。送信者を表すオブジェクトの「ソース」パラメーターと、イベント引数を表す「args」パラメーター。

にアクセスできる場合はMessageReceivedEvent、デリゲートを変更して、送信者を表す「オブジェクト」パラメーターを含める必要があります。次に、HandleMessageメソッドは次のようになります。

private static void HandleMessage(object sender, BatlEyeMessageEventArgs args)
{
        var battleNet = sender as IBattleNet;
        if (battleNet == null)
           return;

        battleNet.Foo();
        PlayerList(args.Message);
}
于 2012-08-12T00:13:20.193 に答える
1

受信メソッドは静的であるため、いくつかの課題が提示されます。特に、複数のメッセージが非常に近い時間に到着した場合はどうなりますか? 後で再利用したい情報を保存すると、次に受信するメッセージによって簡単に上書きされる可能性があります。

このような場合、通常、受信メッセージの解析と処理を担当する新しいクラスを作成し、イベント ハンドラーで、そのクラスの新しいインスタンスを作成して、イベント引数をコンストラクターに渡します。

それ以降、メッセージのすべての処理はクラス インスタンスで行われます。

たとえば、メッセージを保存して検証し、後で解析を実行する、次のようなクラスを作成できます。

public class PlayerListEvent
{
    private string m_sMessage;

    public PlayerListEvent(String sMessage)
    {
        m_sMessage = sMessage;
    }

    public Boolean MessageIsValid()
    {
        // Validate the incoming message

        return true;
    }

    public void ParseMessage() {
        // Perform the message parsing
    }
}

必要に応じて処理できるように、すべての受信メッセージをリスト (またはクラスまたはその他のストレージ メカニズム) に格納できます。

    private static System.Collections.Generic.List<PlayerListEvent> m_cReceivedMessages = new System.Collections.Generic.List<PlayerListEvent>();

次に、メッセージが到着したら、クラスの新しいインスタンスを作成し、それが有効である場合は、後で処理するためにキューに追加できます (受信メッセージを処理するバックグラウンド ワーカー プロセスを起動するなど、ここでは何でもできます。等):

    private static void HandleMessage(BattlEyeMessageEventArgs args) {
    //call a method to analyze data parse

        var oPlayerListEvent = new PlayerListEvent(args.Message);
        if (oPlayerListEvent.MessageIsValid()) {
            lock (m_cReceivedMessages)  {
                m_cReceivedMessages.Add(oPlayerListEvent);
            }
        }
    }
于 2012-08-12T00:13:44.517 に答える
1

オブジェクトを渡すようにハンドラーを変更します。

b.MessageRecievedEvent += (e) => HandleMessage(b, e);
....
private static void HandleMessage(IBattleNet b, BattleMessageEventArgs args) {
....

ラムダ式は引数を 'e' として保存し、オブジェクトと 'e' の両方を渡して HandleMessage を呼び出します。

ただし、IBattleNET 内でイベント自体にアクセスして変更できる場合は、Pickles で提示された規則の方がより適切です。

于 2012-08-12T00:14:32.630 に答える