我运行一个控制台应用程序并声明并实例化了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消息){...}以便不必进行强制转换。我如何注册这个OnControlMessage,以便我可以用我选择的参数回调这个方法?我可能有许多不同的回调方法,因此当我创建CallBackMethod对象时,需要坚持使用1行短路方式进行注册,就像我目前在a)中所做的那样。我希望这有点清楚。
答案 0 :(得分: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)
{
....
}