C# 在事件驱动编程中逐个调用函数

C# 在事件驱动编程中逐个调用函数,c#,.net,design-patterns,event-driven-design,C#,.net,Design Patterns,Event Driven Design,我正在开发一个软件,软件向硬件面板发出命令,一旦发出命令,几秒钟后就会收到响应。不同的硬件命令有不同的功能,如 public void FunctionA() { StartCommandA(); } 以及同一模式上用于运行其他命令的其他函数 FunctionB(); FunctionC(); 一旦我们收到命令A的响应,我就从响应中调用另一个函数,但是按照设计模式实践,这种方法并不好 我想做的就是列出一个函数列表,然后一个接一个地调用所有这些函数,但一旦我得到第一个函数的响应,就会调

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

public void FunctionA()
{
    StartCommandA();
}
以及同一模式上用于运行其他命令的其他函数

FunctionB();
FunctionC();
一旦我们收到命令A的响应,我就从响应中调用另一个函数,但是按照设计模式实践,这种方法并不好

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

我通过使用多播委托尝试了这一点,但在我将所有函数添加到该委托后,我无法找到如何调用get函数列表。这就是我一直在尝试的

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 
                }
            }
        }

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

FunctionA();
FunctionB();
FunctionC();
只有在返回上一个方法后,才会调用每个方法

但您说过要在前一个函数有响应后调用下一个函数。现在听起来您的函数是异步运行的。我强烈建议您使用
async
关键字来标记函数,并使它们返回
任务
。你可以了解这一点

然后,您将能够执行以下操作:

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();

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

FunctionA();
FunctionB();
FunctionC();
只有在返回上一个方法后,才会调用每个方法

但您说过要在前一个函数有响应后调用下一个函数。现在听起来您的函数是异步运行的。我强烈建议您使用
async
关键字来标记函数,并使它们返回
任务
。你可以了解这一点

然后,您将能够执行以下操作:

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();

看来你所要达到的目标正是活动的目的。在类中,定义了处理程序(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()的简单调用实际上会导致所有已注册的处理程序按照它们已注册的顺序被调用。

您试图实现的似乎就是事件的用途。在类中,定义了处理程序(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()的简单调用实际上会导致所有已注册的处理程序按照它们已注册的顺序被调用。

是的,所有函数都是异步运行的,一旦得到第一个函数的响应,我们将调用下一个函数。注意:函数的响应以单独的函数名接收,如“OnResponse”@J.Doe。如果您有
OnResponse
函数,请在那里调用下一个函数!这就是问题所在,我不想从OnResponse方法调用下一个函数。要等待的
Func
列表似乎正是OP需要实现的。这将很好地工作,似乎正是我所寻找的@Alexei的解决方案。是的,所有函数都是异步运行的,一旦得到第一个函数的响应,我们将调用下一个函数。注意:函数的响应以单独的函数名接收,如“OnResponse”@J.Doe。如果您有
OnResponse
函数,请在那里调用下一个函数!这就是问题所在,我不想从OnResponse方法调用下一个函数。要等待的
Func
列表似乎正是OP需要实现的。这将很好地工作,似乎正是我在寻找@Alexei的解决方案。我已经创建了一个名为“OnResponse”的方法我用这个方法处理所有的响应。我包含的代码只是一个示例。我想你会重新命名和修改东西来匹配你的情况。主要的一点是“事件”实例的使用。我已经创建了一个名为“OnResponse”的方法,并且我正在处理该方法中的所有响应。我包含的代码只是一个示例。我想你会重新命名和修改东西来匹配你的情况。这里的要点是使用“事件”实例。