我运行一个控制台应用程序并声明并实例化了一个类型为 的对象Foo
。除了Main()
方法之外,我还想指定一个附加方法(让我们调用它ProcessMessages()
)并让它执行一些工作。的主要工作Foo
是接受发送到 tcp 套接字并进行处理的消息。作为该过程的一部分,我需要指定func<T>
传递此类消息的函数。ProcessMessages()
(在 Foo 之外)应该是这样的功能。如何使用 foo 注册此函数,而无需传递对其包含类的引用?
Foo 包含一个 TPL 数据流块,它需要func<T>
对块中的排队项进行操作。但是该函数不包含在 Foo 中,而是包含在实例化 Foo 类型对象的类中。即使我必须编写更复杂的代码,我也在寻找稍后调用此方法的最快方法。最终,我想隐藏 Foo 中的底层 tpl 数据流块,并且只想调用 Foo 中的一个函数,该函数设置一个 tpl 数据流块并向它注册一个位于 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 行简短的方法进行注册。我希望这更清楚一些。