我正在制作一个带有随机发生器的程序。我有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地点:维也纳”
答案 0 :(得分:0)
您正在为station1
,station2
,station3
...注册事件处理程序,但是随后您正在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
会等到所有任务完成执行。