为什么没有记录所有数据?
Why isn't all of the data being logged?
我有一个 List<Passenger>
,其中包含有关他们乘坐我的巴士旅行的信息。
每次我进行一次旅行时,我都会生成一个 运行dom 乘客数量(从 0 到 10 不等),并在他们下车时记录下来。
我 运行 该程序在 10 到 100.000 次之间的任何地方,并且仅在他们下车时将乘客记录到列表中。在最后一站,所有人都被赶了出去。
然后我使用此代码将每位乘客的行程写入文本文件。
代码
在循环完成 运行ning 之后,Program.cs
的 static void Main
内直接调用此代码。
private static async Task LogData(StatManager statManager)
{
await File.WriteAllLinesAsync("test_output_1.txt", statManager.LogAllData());
}
Passenger.cs
public int ID {get; private set;}
public int stops {get; private set;} = 0;
public TripInfo trip {get; private set;}
public Passenger(int passenger_id, int stop_entered)
{
ID = passenger_id;
trip = new TripInfo();
trip.first_stop = stop_entered;
}
public void ExitBus(int exit_stop)
{
//get called once the passenger exits the bus
//at this point, the passenger is added to the main list
trip.exit_stop = exit_stop;
}
public void ArrivedAtStop()
{
stops++; //stop counter
}
public int[] GetStopsVisited()
{
int[] stops = new int[trip.stop_count];
for(int i = 0; i < trip.stop_count; i++)
{
stops[i] = trip.first_stop + i;
}
return stops;
}
public class TripInfo
{
public int first_stop;
public int exit_stop;
public int stop_count
{
get
{
if (exit_stop == null) return -1;
return exit_stop - first_stop;
}
}
}
StatManager.cs
public List<Passenger> LifetimePassengers = new List<Passenger>();
public int LifetimePassengerCount {get; private set;} = 0; //gets incremented in every cycle
private float mean;
private int LifetimeStops
{
get
{
return busManager.CurrentStop + 1; //gets an int that was incremented in every cycle
}
}
public String[] LogAllData()
{
List<String> toLog = new List<string>();
toLog.Add("LifetimeStops:"+LifetimeStops.ToString());
toLog.Add("LifetimePassengers:"+LifetimePassengerCount.ToString());
toLog.Add("IndividualPassengerData");
foreach(Passenger p in LifetimePassengers)
{
toLog.Add("-");
toLog.Add($"PassengerID:{p.ID}");
toLog.Add($"NumberOfStops:{p.stops}");
toLog.Add($"FirstStop:{p.trip.first_stop}");
toLog.Add($"ExitStop:{p.trip.exit_stop}");
string stops = String.Join(",", p.GetStopsVisited());
toLog.Add($"StopsVisited:[{stops}]");
}
return toLog.ToArray();
}
第一行的输出符合预期,但后来我得到了:
...
PassengerID:677
NumberOfStops:2
FirstStop:198
ExitStop:200
StopsVisited:[198,199]
PassengerID:678
NumberOfStops:2
FirstStop:198
ExitStop:200
StopsVisited:[198,199]
PassengerID:679
NumberOfStops:1
Fi
所有数据都遵循上述 ID 和一些行程信息的模式。但资料不全。上面,记录的最后一位乘客是 679 号,但程序 运行 停靠 1.000 次,并且至少有 1.000 名乘客。数据也突然停止Fi
并且没有完成乘客编号679的记录。
此外,当我尝试重新运行程序时,它没有输出任何东西。我尝试了 运行 循环次数:5、10 和 100,没有区别,也没有输出。
我该怎么做才能解决这个问题?
我认为您需要遵循从 main 调用异步方法的模式:
public static void Main()
{
MainAsync().GetAwaiter().GetResult();
}
private static async Task MainAsync()
{
//
var statManager = new StatManager();
// you code here ...
await LogData(statManager);
}
private static async Task LogData(StatManager statManager)
{
await File.WriteAllLinesAsync("test_output_1.txt",
statManager.LogAllData());
}
我有一个 List<Passenger>
,其中包含有关他们乘坐我的巴士旅行的信息。
每次我进行一次旅行时,我都会生成一个 运行dom 乘客数量(从 0 到 10 不等),并在他们下车时记录下来。
我 运行 该程序在 10 到 100.000 次之间的任何地方,并且仅在他们下车时将乘客记录到列表中。在最后一站,所有人都被赶了出去。
然后我使用此代码将每位乘客的行程写入文本文件。
代码
在循环完成 运行ning 之后,Program.cs
的 static void Main
内直接调用此代码。
private static async Task LogData(StatManager statManager)
{
await File.WriteAllLinesAsync("test_output_1.txt", statManager.LogAllData());
}
Passenger.cs
public int ID {get; private set;}
public int stops {get; private set;} = 0;
public TripInfo trip {get; private set;}
public Passenger(int passenger_id, int stop_entered)
{
ID = passenger_id;
trip = new TripInfo();
trip.first_stop = stop_entered;
}
public void ExitBus(int exit_stop)
{
//get called once the passenger exits the bus
//at this point, the passenger is added to the main list
trip.exit_stop = exit_stop;
}
public void ArrivedAtStop()
{
stops++; //stop counter
}
public int[] GetStopsVisited()
{
int[] stops = new int[trip.stop_count];
for(int i = 0; i < trip.stop_count; i++)
{
stops[i] = trip.first_stop + i;
}
return stops;
}
public class TripInfo
{
public int first_stop;
public int exit_stop;
public int stop_count
{
get
{
if (exit_stop == null) return -1;
return exit_stop - first_stop;
}
}
}
StatManager.cs
public List<Passenger> LifetimePassengers = new List<Passenger>();
public int LifetimePassengerCount {get; private set;} = 0; //gets incremented in every cycle
private float mean;
private int LifetimeStops
{
get
{
return busManager.CurrentStop + 1; //gets an int that was incremented in every cycle
}
}
public String[] LogAllData()
{
List<String> toLog = new List<string>();
toLog.Add("LifetimeStops:"+LifetimeStops.ToString());
toLog.Add("LifetimePassengers:"+LifetimePassengerCount.ToString());
toLog.Add("IndividualPassengerData");
foreach(Passenger p in LifetimePassengers)
{
toLog.Add("-");
toLog.Add($"PassengerID:{p.ID}");
toLog.Add($"NumberOfStops:{p.stops}");
toLog.Add($"FirstStop:{p.trip.first_stop}");
toLog.Add($"ExitStop:{p.trip.exit_stop}");
string stops = String.Join(",", p.GetStopsVisited());
toLog.Add($"StopsVisited:[{stops}]");
}
return toLog.ToArray();
}
第一行的输出符合预期,但后来我得到了:
...
PassengerID:677
NumberOfStops:2
FirstStop:198
ExitStop:200
StopsVisited:[198,199]
PassengerID:678
NumberOfStops:2
FirstStop:198
ExitStop:200
StopsVisited:[198,199]
PassengerID:679
NumberOfStops:1
Fi
所有数据都遵循上述 ID 和一些行程信息的模式。但资料不全。上面,记录的最后一位乘客是 679 号,但程序 运行 停靠 1.000 次,并且至少有 1.000 名乘客。数据也突然停止Fi
并且没有完成乘客编号679的记录。
此外,当我尝试重新运行程序时,它没有输出任何东西。我尝试了 运行 循环次数:5、10 和 100,没有区别,也没有输出。
我该怎么做才能解决这个问题?
我认为您需要遵循从 main 调用异步方法的模式:
public static void Main()
{
MainAsync().GetAwaiter().GetResult();
}
private static async Task MainAsync()
{
//
var statManager = new StatManager();
// you code here ...
await LogData(statManager);
}
private static async Task LogData(StatManager statManager)
{
await File.WriteAllLinesAsync("test_output_1.txt",
statManager.LogAllData());
}