为什么没有记录所有数据?

Why isn't all of the data being logged?

我有一个 List<Passenger>,其中包含有关他们乘坐我的巴士旅行的信息。
每次我进行一次旅行时,我都会生成一个 运行dom 乘客数量(从 0 到 10 不等),并在他们下车时记录下来。

我 运行 该程序在 10 到 100.000 次之间的任何地方,并且仅在他们下车时将乘客记录到列表中。在最后一站,所有人都被赶了出去。

然后我使用此代码将每位乘客的行程写入文本文件。

代码

在循环完成 运行ning 之后,Program.csstatic 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());
}