在事件驱动编程中一个接一个地调用函数

时间:2018-01-24 06:44:31

标签: c# .net design-patterns event-driven-design

我正在使用软件为硬件面板发出命令的软件,一旦命令发出,几秒钟后就会收到响应。不同的硬件命令有不同的功能,如

public void FunctionA()
{
    StartCommandA();
}

以及用于运行其他命令的相同模式上的其他函数。

FunctionB();
FunctionC();

一旦我们收到命令A的响应,我就会从响应中调用另一个函数,但这种方法并不符合设计模式的做法。

我想做的就是创建一个函数列表并一个接一个地调用所有这些函数,但是一旦得到第一个函数的响应,就会调用下一个函数。

我通过使用多播委托尝试了这一点,但是一旦我将所有功能添加到该委托,我就无法找到我们如何调用获取功能列表。这是我自那以后尝试做的事情。

FunList funList_ConfigAndSerialTests = new FunList(StartSerialTest);

        funList_ConfigAndSerialTests += StartSerialTest;

        funList_ConfigAndSerialTests += StartMsrTest;

        funList_ConfigAndSerialTests += StartContactLessTest;

        //funList_ConfigAndSerialTests.Invoke();

        Delegate[] del = funList_ConfigAndSerialTests.GetInvocationList();

        foreach (Delegate item in funList_ConfigAndSerialTests.GetInvocationList())
        {
            while (true)
            {
                if (IsResponseReceived == true)
                {
                    // Call function here 
                }
            }
        }

2 个答案:

答案 0 :(得分:2)

最简单的方法是逐个调用函数:

FunctionA();
FunctionB();
FunctionC();

只有在前一个方法返回后才会调用每个方法。

但是你说你想在上一个函数响应后调用下一个函数。现在听起来你的函数是异步运行的。我强烈建议您使用async关键字标记您的函数,并让它们返回Task<ResonseType>。您可以了解此here

然后你就可以做到这样的事情:

await FunctionA(); // you obviously want to do something with the returned response
                   // I do not know your requirements so I did not show that part
await FunctionB();
await FunctionC();

答案 1 :(得分:1)

您正在尝试实现的是事件的目的。在类中,定义处理程序(FunctionA,FunctionB,...)创建一个事件实例,如下所示:

public class MyClass
{
    private event Action Event;

    public void RegisterHandlers()
    {
        Event += FuncA;
        Event += FuncB;

        Event();
    }

    public void HandleCommand()
    {
        this.Event();
    }

    private void FuncA() { /*...*/ }
    private void FuncB() { /*...*/ }
}

对Events()的简单调用实际上会导致所有已注册的处理程序按照它们已注册的顺序被调用。