使用事件的程序流
本文关键字:程序 事件 | 更新日期: 2023-09-27 18:28:13
我正在尝试编写一个程序,其中步骤1->启动步骤2->启动步骤3。变量在每个步骤之间传递。
我可以在C#中以这种方式使用事件吗?编写这样一个程序的最佳方式是什么?
public class ProgramFlow // the listener program
{
EventArgs args = null;
public delegate void EventHandler(string str, EventArgs e);
public static event EventHandler Step1Reached;
public static event EventHandler Step2Reached;
public ProgramFlow()
{
Step1 step1 = new Step1();
// Print string and kick off Step2
Step2 step2 =new Step2();
// Print String kick off next step
}
}
public class Step1
{
string charRead;
public Step1()
{
Console.Write("Input something for Step1: ");
charRead = Console.ReadLine();
Console.WriteLine();
ProgramFlow.Step1Reached += ProgramFlow_Step1Reached;
}
void ProgramFlow_Step2Reached(string str, EventArgs e)
{
Console.WriteLine(charRead);
}
}
public class Step2
{
string charRead;
public Step2()
{
Console.Write("Input something for Step2: ");
charRead = Console.ReadLine();
Console.WriteLine();
ProgramFlow.Step2Reached += ProgramFlow_Step2Reached;
}
void ProgramFlow_Step2Reached(string str, EventArgs e)
{
Console.WriteLine(charRead);
}
}
class Program
{
static void Main(string[] args)
{
ProgramFlow programFlow = new ProgramFlow();
Console.ReadKey();
}
}
对接步骤并让程序流协调其执行是否符合您的要求,例如
public class ProgramFlow // the listener program
{
public ProgramFlow()
{
IStep[] steps = new IStep[] { new Step1(), new Step2() };
foreach (var step in steps)
{
step.Step();
step.StepResult();
}
}
}
public interface IStep
{
void Step();
void StepResult();
}
public class Step1 : IStep
{
string stringRead;
public void Step()
{
Console.Write("Input something for Step1: ");
stringRead = Console.ReadLine();
Console.WriteLine();
}
public void StepResult()
{
Console.WriteLine(stringRead);
}
}
public class Step2 : IStep
{
string stringRead;
public void Step()
{
Console.Write("Input something for Step2: ");
stringRead = Console.ReadLine();
Console.WriteLine();
}
public void StepResult()
{
Console.WriteLine(stringRead);
}
}
class Program
{
static void Main(string[] args)
{
ProgramFlow programFlow = new ProgramFlow();
Console.ReadKey();
}
}
当您希望在不派生新对象的情况下提供可扩展性时,事件将帮助您,当您希望发生多个操作时,事件非常有用。当您使用无序执行时,事件可以提供帮助(尽管异步也可以在这方面提供帮助)。如果您有任何问题,或者如果您想向GUI报告进度,那么是的,事件是实现这一点的好方法。
老实说,如果您需要按顺序执行操作1、操作2和操作3,那么如果您简单地写:,代码不是更简单、更可维护吗
public static void Main()
{
var arg1 = ReadAction1();
Action1(arg1);
var arg2 = ReadAction2();
Action2(arg2);
var arg3 = ReadAction3();
Action3(arg3);
}
也就是说,这将带你走上一条非常必要的道路。我想看看你是否可以用OO的方式表示你的任务,这样你就可以得到一些可以交换和测试的东西。