by Anonymous » 25 Aug 2025, 00:36
Ich verwende einen Kanal in einem Produzenten-Verbraucher-Szenario, und ich habe die Anforderung, den Kanal in jeweils 10 Elementen zu konsumieren, und ohne mehr als 5 Sekunden lang in einem Puffer im Leerlauf zu bleiben. Diese Dauer ist die maximale Latenz zwischen dem Lesen eines Elements aus dem Kanal und einer Stapel, die dieses Element enthält. Die maximale Latenzrichtlinie hat Vorrang vor der Stapelgrößenrichtlinie, sodass eine Stapel auch mit weniger als 10 Elementen verarbeitet werden sollte, um die maximale Latenzanforderung zu erfüllen.
Code: Select all
public static async IAsyncEnumerable ReadAllBatches(
this ChannelReader channelReader, int batchSize)
{
List buffer = new();
while (true)
{
T item;
try { item = await channelReader.ReadAsync(); }
catch (ChannelClosedException) { break; }
buffer.Add(item);
if (buffer.Count == batchSize)
{
yield return buffer.ToArray();
buffer.Clear();
}
}
if (buffer.Count > 0) yield return buffer.ToArray();
await channelReader.Completion; // Propagate possible failure
}
< /code>
Ich habe vor, es so zu verwenden: < /p>
await foreach (Item[] batch in myChannel.Reader.ReadAllBatches(10))
{
Console.WriteLine($"Processing batch of {batch.Length} items");
}
Meine Frage ist: Wie kann ich meine Readallbatches verbessern Implementierung mit einem zusätzlichen Zeitlimiten-Timeout Parameter, der die oben genannte maximale Latenz-Richtlinie durchsetzt, und ohne die von Drittanbietern versehene Pakete zu senken. Das hier gemeldete
Problem mit dem Speicherleck. Die Schleife, die den Kanal verbraucht, sollte also nicht das stetige Erhöhung des von der Anwendung verwendeten Speichers verursachen, falls der Produzent, der die Elemente im Kanal schreibt, über einen längeren Zeitraum nicht im Leerlauf geworden ist. Ich interessiere mich für eine Methode, die aus Leistungsgründen direkt auf den Channelreader abzielt.
Ich verwende einen Kanal in einem Produzenten-Verbraucher-Szenario, und ich habe die Anforderung, den Kanal in jeweils 10 Elementen zu konsumieren, und ohne mehr als 5 Sekunden lang in einem Puffer im Leerlauf zu bleiben. Diese Dauer ist die maximale Latenz zwischen dem Lesen eines Elements aus dem Kanal und einer Stapel, die dieses Element enthält. Die maximale Latenzrichtlinie hat Vorrang vor der Stapelgrößenrichtlinie, sodass eine Stapel auch mit weniger als 10 Elementen verarbeitet werden sollte, um die maximale Latenzanforderung zu erfüllen.[code]public static async IAsyncEnumerable ReadAllBatches(
this ChannelReader channelReader, int batchSize)
{
List buffer = new();
while (true)
{
T item;
try { item = await channelReader.ReadAsync(); }
catch (ChannelClosedException) { break; }
buffer.Add(item);
if (buffer.Count == batchSize)
{
yield return buffer.ToArray();
buffer.Clear();
}
}
if (buffer.Count > 0) yield return buffer.ToArray();
await channelReader.Completion; // Propagate possible failure
}
< /code>
Ich habe vor, es so zu verwenden: < /p>
await foreach (Item[] batch in myChannel.Reader.ReadAllBatches(10))
{
Console.WriteLine($"Processing batch of {batch.Length} items");
}
[/code]
[b] Meine Frage ist: [/b] Wie kann ich meine Readallbatches verbessern Implementierung mit einem zusätzlichen Zeitlimiten-Timeout Parameter, der die oben genannte maximale Latenz-Richtlinie durchsetzt, und ohne die von Drittanbietern versehene Pakete zu senken. Das hier gemeldete [url=viewtopic.php?t=26065]Problem[/url] mit dem Speicherleck. Die Schleife, die den Kanal verbraucht, sollte also nicht das stetige Erhöhung des von der Anwendung verwendeten Speichers verursachen, falls der Produzent, der die Elemente im Kanal schreibt, über einen längeren Zeitraum nicht im Leerlauf geworden ist. Ich interessiere mich für eine Methode, die aus Leistungsgründen direkt auf den Channelreader abzielt.