如何注册后来调用的函数?

时间:2012-07-20 16:49:11

标签: c# interface delegates task-parallel-library function-prototypes

我运行一个控制台应用程序并声明并实例化了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)中所做的那样。我希望这有点清楚。

1 个答案:

答案 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)
{
    ....
}