在允许用户输入输入的同时添加控件以进行winform

时间:2011-04-01 16:48:07

标签: winforms multithreading c#-4.0 task-parallel-library

我有一个WinForms数据输入表单,将有超过1500个问题。我将问题分成几个部分,每个部分都会有一些未知的问题。每个部分都是自己的用户控件,并为每个问题动态创建和添加行(2个面板,2个标签,一个文本框和另一个用户控件)。然后将部分控件添加到表单中。

我的问题是,即使使用TPL(任务并行库),该过程也需要很长时间。我最终想创建/添加控件并允许用户同时开始输入数据。控件进入可滚动面板。当用户输入数据时,该数据将需要在本地数据库上处理......因此可能需要更多线程。

我尝试使用TPL(我是新手),在处理过程中将所有控件添加到列表中,然后在Parallel.ForEach完成后排序并添加到表单中...大约需要20个超过1200个问题的秒数。

我也尝试过使用BackgroundWorker组件。使用BWC似乎是两者中较快的一个,但ProgressChanged()事件处理程序存在竞争条件,而不是所有控件都被添加...更不用说表单在重新渲染时的外观。

我刚刚使用TPL错了吗?最好的方法是什么?还有其他方式或者我只是让用户坚持等待吗?

由于

1 个答案:

答案 0 :(得分:1)

  

我刚刚使用TPL错了吗?最好的方法是什么?还有其他方式或者我只是让用户坚持等待吗?

最有可能的是,您可以使用TPL,并获得与BW相同的响应时间,但这种类型的操作可以使用更好的API。

这里的技巧是获取用于UI交互的TaskScheduler设置,然后使用Task类在控件准备就绪时将控件推回到UI线程。我有一个blog post on this specific subject,它显示了如何使用TaskScheduler设置来与UI线程一起使用。

但是,我建议将它们保存在内存中并分批推送,以避免不断重新呈现UI。无论你在做什么,这都可能是一个问题。

话虽如此 - 我在这里质疑你的整体视觉设计 - 如果你试图向用户展示超过1200个问题,某种形式的分页可能比一个巨大的可滚动容器更好。如果您对这些页面进行分页,您可以加载并处理前几个(这可能是即时的,因为您提到您可以处理大约50个问题/秒),然后在显示前几个问题后继续加载其他问题。