在事件驱动编程中一个接一个地调用函数
Calling functions one after other in event driven programming
我正在开发一种软件,该软件向硬件面板发出命令,一旦发出命令,几秒钟后就会收到响应。不同的硬件命令有不同的功能,例如
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
}
}
}
最简单的方法是一个一个地调用函数:
FunctionA();
FunctionB();
FunctionC();
只有在前一个方法 returned 之后才会调用每个方法。
但是你说你想在前一个函数有响应后调用下一个函数。现在听起来您的函数 运行 是异步的。我强烈建议您使用 async
关键字来标记您的函数并使它们 return 成为 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();
看来您要实现的是事件的目的。在 class 中,定义了处理程序(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() 的简单调用实际上会导致所有已注册的处理程序按照它们注册的顺序被调用。
我正在开发一种软件,该软件向硬件面板发出命令,一旦发出命令,几秒钟后就会收到响应。不同的硬件命令有不同的功能,例如
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
}
}
}
最简单的方法是一个一个地调用函数:
FunctionA();
FunctionB();
FunctionC();
只有在前一个方法 returned 之后才会调用每个方法。
但是你说你想在前一个函数有响应后调用下一个函数。现在听起来您的函数 运行 是异步的。我强烈建议您使用 async
关键字来标记您的函数并使它们 return 成为 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();
看来您要实现的是事件的目的。在 class 中,定义了处理程序(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() 的简单调用实际上会导致所有已注册的处理程序按照它们注册的顺序被调用。