|
|
1
2
.NET 4.0通过引入
对于您的场景,我建议将每个属性(或属性组)的加载拆分为单独的任务。任务包括“父”的概念,因此每个对象的加载可能是拥有属性加载任务的父任务。
要处理取消,请使用新的统一取消框架。创建
为了处理并发性(或者更恰当地说,
不
-并发),使用
用户界面进度更新可以通过创建用户界面更新来完成。
关于
|
|
|
2
1
使用线程,将工作放到线程安全集合中,并在更新UI以在正确的线程中执行时使用Invoke |
|
|
3
1
听起来很棘手! 你说你的数据源不是线程安全的。那么,这对用户意味着什么呢?如果他们到处点击,但在点击其他地方之前不要等待属性加载,他们可以点击10个需要很长时间加载的节点,然后坐在第10个节点上等待。加载必须一个接一个地运行,因为数据源访问不是线程安全的。这表明线程池不是一个好的选择,因为它将并行运行负载并破坏线程安全。如果可以中途中止加载,以防止用户在开始加载希望看到的页面之前必须等待最后9个节点加载,那将是一件好事。 如果负载可以中止,我建议一个后台工作人员最好。如果用户切换了节点,而backgroundworker已经很忙,则设置一个事件或某个事件来表示它应该中止现有的工作,然后将新工作排队以加载当前页面。 另外,考虑一下,让线程池中运行的线程报告进度并不太困难。为此,请将进度对象传递给类似以下类型的QueueUserWorkItem调用:
线程可以对此进行写入,并且UI线程可以轮询(从System.Windows.Forms.Timer事件)以读取进度并更新进度条或动画。 另外,如果您包含一个中止属性。如果用户更改节点,用户界面可以设置它。加载方法可以在其操作的各个点检查中止值,如果设置了中止值,则返回而不完成加载。 说实话,你所选择的并不重要。这三个选项都可以在后台线程上完成任务。如果我是你,我会从后台工作人员开始,因为它的设置非常简单,如果你决定你需要更多的东西,考虑切换到线程池或普通线程之后。 BackgroundWorker还具有这样的优点:您可以使用它的Completed事件(在主UI线程上执行)用加载的数据更新UI。 |