Wie aggregiere ich die Daten eines asynchronen Produzenten und schreibe sie in eine Datei?

Ich lerne etwas über asynchrone / Warte-Muster in C #. Momentan versuche ich ein Problem wie dieses zu lösen:

Es gibt einen Hersteller (ein Hardwaregerät), der 1000 Pakete pro Sekunde generiert. Ich muss diese Daten in einer Datei protokollieren.

Das Gerät hat nur eineReadAsync() Methode, um jeweils ein einzelnes Paket zu melden.

Ich muss die Pakete puffern und sie in der Reihenfolge schreiben, in der sie in der Datei generiert werden, nur einmal pro Sekunde.

Der Schreibvorgang sollte fehlschlagen, wenn der Schreibvorgang nicht rechtzeitig beendet wird, wenn der nächste Paketstapel zum Schreiben bereit ist.

Bisher habe ich so etwas wie unten geschrieben. Es funktioniert, aber ich bin nicht sicher, ob dies der beste Weg ist, um das Problem zu lösen. Irgendwelche Kommentare oder Vorschläge? Was ist die beste Vorgehensweise, um diese Art von Erzeuger- / Verbraucherproblemen anzugehen, bei denen der Verbraucher die vom Erzeuger erhaltenen Daten aggregieren muss?

static async Task TestLogger(Device device, int seconds)
{
    const int bufLength = 1000;
    bool firstIteration = true;
    Task writerTask = null;

    using (var writer = new StreamWriter("test.log")))
    {
        do
        {
            var buffer = new byte[bufLength][];

            for (int i = 0; i < bufLength; i++)
            {
                buffer[i] = await device.ReadAsync();
            }

            if (!firstIteration)
            {
                if (!writerTask.IsCompleted)
                    throw new Exception("Write Time Out!");
            }

            writerTask = Task.Run(() =>
                {
                    foreach (var b in buffer)
                        writer.WriteLine(ToHexString(b));
                });

            firstIteration = false;
        } while (--seconds > 0);
    }
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage