0

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

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

2 回答 2

2

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

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

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

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

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

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();
于 2018-01-24T07:00:00.530 回答
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() 的简单调用实际上将导致所有已注册的处理程序按照它们注册的顺序被调用。

于 2018-01-24T07:26:07.330 回答