我在ASP.NET用戶控件中有一個列表框,我想填充從數據庫檢索的潛在大List<string>
(最多50k項)。當列表框被填充(在頁面加載事件中)時,我不想阻止UI。使用同步代碼,直到列表框中人口完成不顯示頁面:異步填充ASP.NET ListBox而不阻塞UI
List<string> items = GetItemsFromDB();
foreach (var item in items) // can take some time, blocks UI
{
if (shouldItemBeListed(item))
ListBox1.Items.Add(item);
}
我來自桌面應用程序背景哪裏實現,這是簡單的使用例如BackgroundWorker
- 用戶將實時看到填充了新項目的列表框。網絡的東西似乎更復雜一點,我想就什麼是最好的方式去做這個建議。
這裏是我的嘗試:
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的線程。工作稍好一點(至少列表框正在更新新項目),但仍然非常反應遲鈍。
var bw = new BackgroundWorker();
bw.DoWork += (o, args) => Populate();
bw.RunWorkerAsync();
我總是可以按照用戶的要求將列表框項目分成更小的組和填充更多,但通常如何實現?
我認爲你要找的是一個Ajax回調,不需要後臺線程變得複雜。 – Damon
當你開始有這樣的需求時,該開始學習ASP.Net MVC和/或ASP.Net Web api了。實施起來要容易得多。 –
再次讀你的問題,我覺得你犯了錯誤。不是加載50K項目,然後刪除不需要的項目,爲什麼不加載相關項目?你可以將'shouldItemBeListed'方法中的邏輯移動到數據庫查詢中嗎? –