简短的问题:
我想生成一个后台线程来处理提交到队列的工作项(比如一个线程池)。有些工作项能够报告进度,有些则不能。我应该使用 .NET 的无数多线程方法中的哪一种?
冗长的解释(避免询问没有任何意义的一半):
我的 winforms 应用程序的主窗口垂直分成两半。左半部分包含一个带有项目的树视图。当用户双击树视图中的一个项目时,该项目在右半边打开。几乎所有对象都有很多属性,分为几个部分(由选项卡表示)。这些属性的加载需要相当长的时间,通常在 10 秒左右,有时甚至更多。并且每隔一段时间就会添加更多属性,因此时间会增加。
目前我的单线程设计使 UI 这次没有响应。这自然是不可取的。我想在后台逐部分加载东西,一旦加载一部分就可以使用。对于其他部分,我会显示一个带有加载动画或其他内容的占位符选项卡。此外,虽然某些部分是在单个冗长的整体操作中加载的,但其他部分由许多较小的函数调用和计算组成,因此可以显示加载进度。对于这些部分,很高兴看到进度(特别是如果它们挂在某个地方,这种情况发生了)。
请注意,数据源不是线程安全的,所以我不能同时加载两个部分。
什么方法最好实现这种行为?是否有一些 .NET 课程可以减轻我的工作负担,或者我应该放下并弄脏 .NETThread
吗?
A 进行ThreadPool
工作项队列管理,但没有用于进度报告的设施。BackgroundWorker
另一方面支持进度报告,但它适用于单个工作项。有没有可能两者兼而有之?