【问题标题】:Slow showing / drawing dialogue with ListBox?使用 ListBox 缓慢显示/绘制对话?
【发布时间】:2014-03-26 23:03:30
【问题描述】:

我的应用程序使用实体框架来提取一小部分结果......它需要大约 3 秒才能完成?为什么会这样?

Start.cs

...
private void projectToolStripMenuItem_Click(object sender, System.EventArgs e)
{
    NewProject newProjectForm = new NewProject();
    newProjectForm.ShowDialog(); // It seems to take about 3 or 4 seconds to actually get to this :S
}
...

NewProject.cs

public partial class NewProject : Form
{
    private EFProjectTypeRepository projectTypeRepository;

    public NewProject()
    {
        projectTypeRepository = new EFProjectTypeRepository();

        InitializeComponent();
        ListBoxProjectTypes();
    }

    public void ListBoxProjectTypes()
    {    
        DateTime then = DateTime.Now;

        // PreLoadedResources.projectTypes is a preloaded resource which takes split seconds to load.

        ListBoxProjectType.Items.AddRange(PreLoadedResources.projectTypes.Select(item => (object)item.Title).ToArray()); // If I comment this line out, the dialogue is almost instant @ timeTaken  {00:00:00.0010019}

        DateTime now = DateTime.Now;
        TimeSpan timeTaken = now.Subtract(then); 
    }
}

timeTaken   {00:00:02.4261369}  System.TimeSpan

当我第二次去展示对话时,它是即时的!

到目前为止,我的列表框显示了 1 个项目,哈哈。

注意事项

public static class PreLoadedResources
{
    public static IEnumerable<ProjectType> projectTypes;
}

【问题讨论】:

  • 也许ProjectType 引用了一些没有延迟加载的子项?如果是这种情况,您可能会提取比您想象的更多的数据。你能告诉我们ProjectType类吗?
  • 嗯,我没有看到确凿的证据。我唯一能想到的另一件事是与数据库的连接速度很慢(假设您使用的是数据库)。
  • 我想我正在使用 (LocalDb)\V11.0。我使用数据库是因为我认为它最容易更新。
  • 现在,我要预加载资源并在其中插入一个加载条。不知道为什么这么慢

标签: c# winforms listbox


【解决方案1】:

每次添加项目时,ListBox 都必须重新绘制。您可以使用 Dmitry 使用 AddRange() 的方法,也可以使用 BeginUpdate()/EndUpdate() 调用来包装循环。

ListBoxProjectType.BeginUpdate();

foreach( var projectType in projectTypes )
{
    ListBoxProjectType.Items.Add(projectType.Title);
}

ListBoxProjectType.EndUpdate();

【讨论】:

  • 很高兴知道,但遗憾的是没有加快对话的显示速度
  • 我猜问题出在数据检索部分。您可以通过调试器逐步了解这一点。
  • 好的,刚刚这样做,并更新了我的 OP,Dmitry 发布的每行大约需要 2 秒。这就是它变慢的地方
【解决方案2】:

尝试用AddRange替换添加单个项目到列表框:

public void ListBoxProjectTypes()
{
    IEnumerable<ProjectType> projectTypes = projectTypeRepository.ProjectTypes;
    ListBoxProjectType.Items.AddRange(projectTypes.Select(item => (object)item.Title).ToArray());
}

或者简单地用ListBoxProjectType.BeginUpdateListBoxProjectType.EndUpdate包装添加的项目。

【讨论】:

  • 很高兴知道,但遗憾的是没有加快对话的显示速度
  • 这意味着问题出在其他地方,在代码的其他部分。
【解决方案3】:

将我的 IEnumerable 更改为 IList 会有所不同:

public static class PreLoadedResources
{
    public static IEnumerable<ProjectType> projectTypes;
}

public static class PreLoadedResources
{
    public static IList<ProjectType> projectTypes;
}

然后在我的加载中(需要 2 秒点击),我只是 .ToList 它而不是...但现在 showdialogue 过程需要几秒钟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多