1

我运行一个控制台应用程序并声明并实例化了一个类型为 的对象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 行简短的方法进行注册。我希望这更清楚一些。

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 回答