gpt4 book ai didi

c# - 是否可以在后台线程中填充 ObjectListView?

转载 作者:行者123 更新时间:2023-12-03 12:58:37 25 4
gpt4 key购买 nike

我有一个应用程序,其中我 向 ListView 添加数千个项目 .此操作可能需要一段时间,但这对应用程序来说没问题。但是,我仍然希望在填充列表时运行一个选取框进度条,以便用户可以看到正在发生的事情。 进度条锁定 因为 UI 线程然后忙于添加项目。

尝试从后台工作人员中填充 ListView 控件 ,但进度条仍然锁定。它让我明白,由于列表控件存在于 UI 线程中,从后台工作人员填充它实际上并没有改变任何东西。

在这种情况下,有没有办法让进度条继续运行?

我想知道是否有可能让进度条在另一个线程中运行,但我不知道该怎么做,或者是否可能。

这是我的代码来说明(添加 2200 个对象):

List.SuspendLayout();

StatusText.Text = "Populating the list...";
ProgressBar.Style = ProgressBarStyle.Marquee;

List.SetObjects(items);

List.ResumeLayout();

我尝试使用 BeginUpdate()EndUpdate()方法也是如此,但它没有明显的效果(我认为它也会暂停和恢复布局)。

最佳答案

感谢您在评论中给我的指示,我能够在填充列表时确定加载延迟:这不是由于列表控件本身造成的。每当将项目添加到列表时,都会访问列中显示的属性 - 正如预期的那样。但是,其中一些属性需要从数据库和磁盘额外加载数据。

为了解决这个问题,我创建了一个单独的后台工作程序来初始化项目的内部数据缓存,然后再将它们添加到列表中。在此之后,实际显示列表最多只需要几秒钟。

为了显示:

private void PopulateList()
{
StatusText.Text = "Populating the list...";

// start the background worker
PopulateListWorker.RunWorkerAsync();
}

private void Worker_PopulateList_DoWork(object sender, DoWorkEventArgs e)
{
// run the data cache initialization
}

private void Worker_PopulateList_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}

private void Worker_PopulateList_Completed(object sender, RunWorkerCompletedEventArgs e)
{
List.SuspendLayout();
List.SetObjects(items);
List.ResumeLayout();

progressBar.Value = 0;
StatusText.Text = "All done.";
}

关于c# - 是否可以在后台线程中填充 ObjectListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61717781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com