我应该在哪里设置EventHandler

时间:2019-04-02 22:26:08

标签: c#

我正在制作一个带有随机发生器的程序。我有9个站点和1个注册器,因此每当婴儿出生时,该信息就会在注册器中调用。

我尝试了一种其他方法,以便该流程可以正常工作,但是没有成功。我认为EventHandler可能在错误的类中。

static Random rnd = new Random();

public string Name { get; private set; }
public DateTime Zeit { get; private set; }
public Station Station { get; private set; }

public Geburtstation(Station st)
{
    Station = st;
}
public event EventHandler<BabyArgs> BabyOnTheWay;

public void SendMessage(object sender, BabyArgs args)
{
    Console.WriteLine($"Baby on the way {args.Zeit}");
}

DateTime newdate = DateTime.Now;
public void Process()
{
    DateTime start = new DateTime(2016, 1, 1);
    for (DateTime dt = start; dt < start.AddYears(1); dt = dt.AddMinutes(30))
    {
        Console.WriteLine(dt);

        if (dt.Minute == 0)
        {
            // 50 % Possibility
            if (rnd.Next(0, 2) == 1)
            {
                BabyOnTheWay?.Invoke(this, new BabyArgs(Station, newdate));
            }
        }
        System.Threading.Thread.Sleep(100);
    }
}

注册课程:

public void Meldung(object sender, BabyArgs args)
{
    Console.WriteLine($"Baby born Date: {args.Zeit} Location: {args.Station}");
}

主要:

Geburtregister reg = new Geburtregister();

Geburtstation station1 = new Geburtstation(Station.Burgenland);
Geburtstation station2 = new Geburtstation(Station.Kärnten);
Geburtstation station3 = new Geburtstation(Station.Niederösterreich);
Geburtstation station4 = new Geburtstation(Station.Oberösterreich);
Geburtstation station5 = new Geburtstation(Station.Salzburg);
Geburtstation station6 = new Geburtstation(Station.Steiermark);
Geburtstation station7 = new Geburtstation(Station.Tirol);
Geburtstation station8 = new Geburtstation(Station.Vorarlberg);
Geburtstation station9 = new Geburtstation(Station.Wien);

station1.BabyOnTheWay += reg.Meldung;
station2.BabyOnTheWay += reg.Meldung;
station3.BabyOnTheWay += reg.Meldung;
station4.BabyOnTheWay += reg.Meldung;
station5.BabyOnTheWay += reg.Meldung;
station6.BabyOnTheWay += reg.Meldung;
station7.BabyOnTheWay += reg.Meldung;
station8.BabyOnTheWay += reg.Meldung;
station9.BabyOnTheWay += reg.Meldung;

station.Process();

Console.ReadKey();

我期望输出例如“婴儿出生于03.04.2019 00:00:00地点:维也纳”

2 个答案:

答案 0 :(得分:0)

您正在为station1station2station3 ...注册事件处理程序,但是随后您正在Process()上调用station。您必须在注册的电台上致电Process()

类似这样的东西:

// Birth Records
var reg = new Geburtregister();

// Create array of maternity wards (stations)
var stationen =  new Geburtstation[] {
    new Geburtstation(Station.Burgenland),
    new Geburtstation(Station.Kärnten),
    new Geburtstation(Station.Niederösterreich),
    new Geburtstation(Station.Oberösterreich),
    new Geburtstation(Station.Salzburg),
    new Geburtstation(Station.Steiermark),
    new Geburtstation(Station.Tirol),
    new Geburtstation(Station.Vorarlberg),
    new Geburtstation(Station.Wien)
};

foreach (Geburtstation station in stationen) {
    station.BabyOnTheWay += reg.Meldung; // Message
    Task.Run(station.Process);
}

Console.ReadKey();

似乎您正在尝试并行运行这些进程。因此,您必须将它们作为任务启动,否则它们将一个接一个地运行。即只有在第一个站点的for循环终止后,第二个站点的过程才会开始。


我有一个更好的模拟行为

private static readonly long simulationStart = DateTime.Now.Ticks;
private static readonly long simulatedStartDate = new DateTime(2016, 1, 1).Ticks;

public void Process()
{
    while (true) {
        System.Threading.Thread.Sleep(rnd.Next(100, 8000));
        // Expand the simulated time by 10000 compared to run time.
        var dateTime =
            new DateTime( 10000 * (DateTime.Now.Ticks - simulationStart) + simulatedStartDate);
        BabyOnTheWay?.Invoke(this, new BabyArgs(Station, dateTime));
    }
}

答案 1 :(得分:0)

除了奥利维尔·雅各布·德斯科姆斯(Olivier Jacot-Descombes)所说的以外,还有另一个例子:

var stationen =  new Geburtstation[] {...}

var tasks = new List<Task>();
foreach (var station in stationen) {
    station.BabyOnTheWay += reg.Meldung;
    tasks.Add(Task.Run(() => station.Process()));
}
Task.WaitAll(tasks.ToArray());

此外,您无需使用Console.ReadKey(),因为Task.WaitAll会等到所有任务完成执行。