向winform添加控件,同时允许用户输入内容

问题描述 投票:0回答:1

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

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

我尝试过使用 TPL(我是新手),方法是在处理过程中将所有控件添加到列表中,然后在

Parallel.ForEach
完成后进行排序并添加到表单中...大约需要 20 秒,超过 1200 个问题。

我还尝试使用

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

我只是错误地使用了 TPL 吗?解决这个问题的最佳方法是什么?有没有其他方法或者我只是让用户等待?

谢谢

winforms multithreading c#-4.0 task-parallel-library
1个回答
1
投票

我只是错误地使用了 TPL 吗?解决这个问题的最佳方法是什么?有没有其他方法或者我只是让用户等待?

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

这里的技巧是获取用于 UI 交互的 TaskScheduler 设置,然后使用 Task 类在控件准备好时将其推回 UI 线程。我有一篇关于这个特定主题的博客文章,其中展示了如何获取与 UI 线程一起使用的 TaskScheduler 设置。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.