コンソール アプリケーションを実行し、タイプ のオブジェクトを宣言してインスタンス化しました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 行の短い方法に固執する必要があります。これがいくらか明確になることを願っています。