我可以尝试从BlockingCollection中获取一组项目吗?
作者:互联网
在我正在处理的应用程序中,每秒接收数千个更新.立即将这些更新立即反映在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);
}
}
}
}
解决方法:
我会考虑使用Reactive ExtensionsReactiveExtensions.此链接解决了类似的问题Stock Trading Example
标签:parallel-extensions,multithreading,task-parallel-library,parallel-processing,c 来源: https://codeday.me/bug/20191031/1978718.html