在我正在处理的应用程序中,每秒接收到数千个更新。立即将这些更新一一反映在 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);
}
}
}
}