私が取り組んでいるアプリケーションでは、毎秒数千の更新が受信されています。これらの更新をすぐに UI に反映するのは、パフォーマンスが過剰です。
次のコードでは、各更新を処理するために UI スレッドを呼び出し、ObservableCollection に新しいアイテムを追加する必要があるため、パフォーマンスが非常に悪くなります。これにより、CollectionChanged イベントがトリガーされます。
foreach (var update in updates.GetConsumingEnumerable())
{
// Handle Update
}
私がやろうとしているのは、パブリッシャーにアイテムを追加する機会を与えるために消費者を少し (つまり 50 ミリ秒) 待機させてから、これらの更新をチャンクで処理することです。
現在、私は次のコードを使用していますが、アイテムが消費される前にコレクション内に留まる時間を予測するのは難しいと思います。このアプローチが別のパフォーマンスのボトルネックを生み出すのではないかと心配しています。
List<Tuple<T, List<string>>> updatesToHandle = new List<Tuple<T, List<string>>>();
while (!updates.IsAddingCompleted)
{
Tuple<T, List<string>> item = null;
if (updates.TryTake(out item, 5)) // Try Take for 5 Milliseconds
{
updatesToHandle.Add(item);
}
else
{
var newItems = new List<T>(updatesToHandle.Count);
var updatedItems = new List<Tuple<T, List<string>>>(updatesToHandle.Count);
foreach (var update in updatesToHandle)
{
try
{
// Handle Update
}
finally
{
updatesToHandle.Clear();
Thread.Sleep(50);
}
}
}
}