短缺问题:采用这种多线程问题的方法是什么?
我想产生一个单一的后台线程会处理(有一个线程像一个线程池)提交到队列中的工作项目。一些工作项目能够报告进展情况,有些则不能。我应该使用.NET的无数多线程方法中的哪一种?
龙解释(避免询问有关half which doesn't make any sense):
我的WinForms应用程序的主窗口被垂直分割为两半。左半部分包含带有项目的树视图。当用户在树视图中双击一个项目时,该项目在右半部分打开。几乎所有的对象都有很多属性,分成几个部分(由制表符表示)。这些属性的加载需要相当长的时间,通常大约10s,有时更多。每隔一段时间就会添加更多的属性,所以时间会增加。
目前,我的单线程设计使UI在这个时候无法响应。自然这是不可取的。我想在背景中逐个加载东西,并且只要一个部件被加载就可以使用。对于其他部分,我会显示一个带有加载动画或其他东西的占位符选项卡。另外,虽然有些零件是在单一冗长的单片操作中加载的,但其他零件由许多较小的函数调用和计算组成,因此可能会显示加载进度。对于这些部件,看到进展情况会很好(特别是如果他们挂在某个地方,会发生什么情况)。
请注意,数据源不是线程安全的,所以我无法同时加载两个部分。
哪种方法最适合实现此行为?有没有一些.NET类可以解除我的肩膀上的一些工作,或者我应该沮丧地用Thread
?
A ThreadPool
没有工作项目队列管理,但没有进度报告设施。另一方面,BackgroundWorker
支持进度报告,但它是针对单个工作项目的。有没有可能是两者的结合?
是的,如果用户点击10个节点,他会等待。实际上,用户界面允许他打开几个项目并同时查看它们,这是一个有效的场景。但我同意,如果他*关闭了其中一项,则加载应该中止。为他目前正在观看的项目设置优先级也是一个很好的功能,没有想到这一点。所以是的,它变得混乱。我想那里不会有任何远程预制的东西。顺便说一句 - 你不觉得一个简单的'volatile int _current'应该是足够的,如果只有一个线程正在写入,并且只有一个线程正在读取它? – 2010-08-13 09:46:06
叶,挥发性应该没问题。 – 2010-08-13 09:50:51