我正在开发一个绑定到数据网格的BindingList
的WPF GUI(.net 3.5)。我处理ListChangedEvent
的{{1}},并且我在同一个BindingList
执行昂贵的linq查询并更新linq结果中的某些属性(引发和发送{{更新时正确显示GUI上的事件)。
我的绑定列表可能已经有数百万条记录,而GUI有时可能会在几秒钟内对这些记录执行数百万次交易(添加或删除)。因此,每笔交易都会引发BindingList
事件。
这是我的GUI影响的地方所以我在背景线程上移动了linq检查。但这是交易......
INotifyPropertyChanged.PropertyChanged
上生成一个新的后台主题。这将导致数百万个线程在几秒钟内在内存中生成......这是内存中非常大的瓶颈。我可以检查bgWorker.IsBusy(),但是当工作人员忙时,跳过处理了很多ListChangedEvent
,从而失去了linq查询的完整性。
假设我找到了解决上述第2点和第3点讨论的问题的方法,我应该依靠每个asyc工作中百万记录集合的快照我做。这将导致大量的本地百万记录集合被创建和GC,可能只需几秒钟......
所以我很困惑什么解决方案能为我提供最好的服务......
现有的伪代码:
ListChangedEvent
我建议的伪代码:
ListChangedEvent
我知道这段代码同样糟糕......因此我对正确的方法感到困惑!
注意: 我无法控制在绑定列表上执行这些百万个事务的其他进程。它可以在几秒钟内或在一天中悠闲地这样做。因此,仅在该过程结束时LINQ同步(我正在另一个线程上执行)是不可能的。
答案 0 :(得分:1)
BackgroundWorker
提供了一个很好的简单界面,可以在您执行一项独立的工作时实现后台处理。它还有一个很好的功能,它提供了一个通过UI线程更新控件的简单机制。但是,它有点受限。
如何使用ThreadPool?这允许您使用大量线程来执行任务。您可以通过QueueUserWorkItem将任务发送到线程池。但是,您必须通过Dispatcher.BeginInvoke
将更新编组回UI线程。