我目前正在使用 C#/WPF 开发一个系统,该系统访问 SQL 数据库,检索一些数据(大约 10000 个项目),然后应该更新一组数据点,这些数据点用作我在我的应用程序中使用的 WPF 图表的数据(Visifire 图表解决方案,以防有人想知道)。
当我编写直截了当的单线程解决方案时,如您所料,系统会在应用程序查询数据库、检索数据和呈现图表所花费的时间段内挂起。但是,我想通过在使用多线程获取和处理数据时向用户添加等待动画来加快此任务。但是,会出现两个问题:
- 在使用多线程时,我无法更新我的集合并保持它们同步。我不是很熟悉
Dispatcher
门课不是很熟悉,所以我不太确定该怎么做。 - 由于我显然没有很好地处理多线程,等待动画不会出现(因为 UI 被冻结)。
我试图弄清楚是否有一种有效地将多线程用于集合的好方法。我发现微软有线程安全的集合,但似乎没有一个符合我的需要。
另外,如果有人有很好的参考来学习和理解Dispatcher
我将不胜感激。
编辑:这是我正在尝试做的代码片段,也许它可以更清楚地说明我的问题:
private List<DataPoint> InitializeDataSeries(RecentlyPrintedItemViewModel item)
{
var localDataPoints = new List<DataPoint>();
// Stopping condition for recursion - if we've hit a childless (roll) item
if (item.Children.Count == 0)
{
// Populate DataPoints and return it as one DataSeries
_dataPoints.AddRange(InitializeDataPoints(item));
}
else
{
// Iterate through all children and activate this function on them (recursion)
var datapointsCollection = new List<DataPoint>();
Parallel.ForEach(item.Children, child => datapointsCollection = (InitializeDataSeries((RecentlyPrintedItemViewModel)child)));
foreach (var child in item.Children)
{
localDataPoints.AddRange(InitializeDataSeries((RecentlyPrintedItemViewModel)child));
}
}
RaisePropertyChanged("DataPoints");
AreDataPointsInitialized = true;
return localDataPoints;
}
谢谢