使用事件的程序流

本文关键字:程序 事件 | 更新日期: 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的方式表示你的任务,这样你就可以得到一些可以交换和测试的东西。