【发布时间】:2014-02-24 14:02:44
【问题描述】:
我在 ASP.NET 用户控件中有一个列表框,我想用从数据库中检索到的可能很大的 List<string> 填充(最多 50k 项)。由于正在填充列表框(在页面加载事件中),我不想阻止 UI。使用同步代码,在列表框填充完成之前不会显示页面:
List<string> items = GetItemsFromDB();
foreach (var item in items) // can take some time, blocks UI
{
if (shouldItemBeListed(item))
ListBox1.Items.Add(item);
}
我来自桌面应用程序背景,实现这一点很简单,例如BackgroundWorker - 用户将看到实时填充新项目的列表框。 Web 的东西似乎有点复杂,我想要一些关于什么是最好的解决方法的建议。
这是我尝试过的:
1.创建后台线程。 效果不太好 - 与桌面 (WinForms) 版本相比,所有内容仍然反应迟钝,并且列表未按预期更新/刷新:
Thread thread = new Thread(new ThreadStart(Populate));
thread.IsBackground = true;
thread.Start();
private void Populate()
{
List<string> items = GetItemsFromDB();
foreach (var item in items)
{
if (shouldItemBeListed(item))
ListBox1.Items.Add(item);
}
}
2。 BackgroundWorker 线程。 比 1 好一点。(至少列表框正在更新新项目),但仍然非常无响应且速度缓慢。
var bw = new BackgroundWorker();
bw.DoWork += (o, args) => Populate();
bw.RunWorkerAsync();
我总是可以将列表框项分成更小的组并根据用户的要求填充更多,但这通常如何正确实施?
【问题讨论】:
-
我认为您正在寻找的是一个 Ajax 回调,不需要复杂的后台线程。
-
当你开始有这样的需求时,是时候开始学习 ASP.Net MVC 和/或 ASP.Net Web api了。更容易实现。
-
再次阅读您的问题,我觉得您做错了。与其加载 50K 项,然后删除不需要的项,不如只加载相关的项?能否将
shouldItemBeListed方法中的逻辑移到数据库查询中? -
@SteveB 确实可以,而且我会 - 我非常想了解使用“手动”方式(快速压力测试)如何工作。我假设我可以简单地使用 DataSource 属性,但我还不确定这种方法的潜在性能问题。
标签: c# asp.net multithreading .net-3.5 backgroundworker