1

コンソール アプリケーションを実行し、タイプ のオブジェクトを宣言してインスタンス化しましたFoo。メソッドに加えMain()て、追加のメソッドを指定し (それを呼び出すことができますProcessMessages())、いくつかの作業を実行させたいと考えています。の主な仕事はFoo、tcp ソケットに送信されて処理されるメッセージを受け入れることです。func<T>プロセスの一部として、そのようなメッセージが渡される関数を指定する必要があります。ProcessMessages()(Foo の外) はそのような関数であるはずです。含まれているクラスへの参照を渡すことなく、この関数を foo に登録するにはどうすればよいですか?

func<T>Foo には、ブロック内のキューに入れられた項目を操作するを必要とする TPL データ フローブロックが含まれています。ただし、関数は Foo 内に含まれているのではなく、タイプ Foo のオブジェクトをインスタンス化したクラスに含まれています。より複雑なコードを書かなければならない場合でも、後でこのメソッドを呼び出す最速の方法を探しています。最終的には、基礎となる tpl データ フロー ブロックを Foo 内に隠して、tpl データ フロー ブロックをセットアップし、後でアイテムを渡すことができる Foo の外部にあるメソッドを登録する関数を Foo で呼び出したいだけです。 . これを行うための最良の方法は何ですか? 登録部分は私を困惑させるものです。

編集:これは、私が達成しようとしていることをよりよく説明するコードです:

a) Main() には、別のクラス内から呼び出される次のメソッドがあります。

public void OnControlMessage(object sender, EventArgs args)
    {
        Console.WriteLine("Comp1 received Control Message");
    }

このメソッドを次の方法で登録します。

List<ZeroMqMessaging.CallBackMethod> registeredMethods = new List<ZeroMqMessaging.CallBackMethod>(){ 
            new ZeroMqMessaging.CallBackMethod(MessageType.ControlMessage, OnControlMessage) };

b) コールバックを呼び出す ActionBlock は次のようになります。

ActionBlock<Tuple<int, byte[]>> newActionBlock = new ActionBlock<Tuple<int, byte[]>>(x => callback.eventHandler(this, new MyEventArg(callback.messageType, x.Item2)));

OnControlMessage は正しく呼び出されますが、特定のメッセージを EventArgs の一部として OnControlMessage に渡す必要があります。EventArg から派生したクラス MyEventArg を作成しましたが、OnControlMessage で MyEventArg のメンバーにアクセスできません。

できれば、キャストする必要がないように、 OnControlMessage(ControlMessage message){...} を使用したいと思います。この OnControlMessage を登録して、選択した引数でこのメソッドをコールバックできるようにするにはどうすればよいですか? 私は潜在的に多くの異なるそのようなコールバック メソッドを持っているので、CallBackMethod オブジェクトを作成するときに、現在 a) で行っているように、登録するための 1 行の短い方法に固執する必要があります。これがいくらか明確になることを願っています。

4

1 に答える 1

1

おそらくデリゲートを作成する必要があります。

public delegate void MyMessageHandler(string message);

その後、次のように使用できます。

public void Work(MyMessageHandler callback)
{
    string message = "";
    ....
    callback(message);
}

次に、次のように呼び出します。

public Main()
{
    Work(ProcessMessages);
}
public void ProcessMessages(string message)
{
    ....
}
于 2012-07-20T16:56:16.507 に答える