【问题标题】:Overcoming lazy loading of tabControls and Combobxes克服 tabControls 和 Comboxxes 的延迟加载
【发布时间】:2013-07-16 20:21:13
【问题描述】:

在 C# 中加载主 UI 表单之前,我正在加载一些包含大量字符串的组合框(一个具有 +70,000 个值)。我在 tabControl 的单独 tabPages 中有组合框。我这样做是为了在显示 UI 表单时不会延迟显示选项卡和组合框。

现在,问题是第一个 tabPage 运行良好,并且显示得很快。但是,包含其他组合框的其他 tabPages 最多需要 10 秒才能完全呈现和显示。

我曾尝试在加载 UI 表单之前使用 CreateControl 创建控件(组合框),但没有帮助。我了解 C# tabControls 具有这种所谓的“延迟加载”行为。我想知道如何克服“懒惰”功能,以便在显示表单之前创建和呈现组合框,并且当我切换到其他标签页时,没有延迟?

[现在编辑了标签 - 这是与 WinForms 相关的。]

谢谢,

【问题讨论】:

  • 我从标题中假设这与 winforms 无关,但可能值得用相关的 UI 框架(WinForms、WebForms、ASP.NET、Silverlight、MVC 等)标记您的问题消除混淆并将问题指向最适合回答的问题。
  • 仅供参考,我 just tested 一个包含 100,000 个项目并启用 UI Virtualization 的 WPF 组合框,我的机器上的加载时间为 0.0053 秒。您最好的选择是使用ElementHost 并在您的(现有?)winforms 应用程序中托管一个 WPF ComboBox。这是从 winforms 中获得任何好处的唯一方法。

标签: c# winforms combobox tabcontrol lazy-evaluation


【解决方案1】:

我想线程将是克服您的问题的概念。您可以做的是在表单加载时启动一个新线程。让线程完成组合框填充或您需要的任何工作。

此线程将异步更新所有组合框。所以表单加载时不会有延迟。下面提供了线程的简短示例。我想这会帮助你百分之几!

public class MyClass
{
    private volatile bool _KillThread;

    // This method will be called when the thread is started.
    public void DoWork()
    {
        while (!_KillThread)
        {
            //Do your work
        }

    }
    public void RequestStop()
    {
        _KillThread= true;
    }

}

static void MyFunction()
{
        MyClassworkerObject = new MyClass();
        Thread workerThread = new Thread(workerObject.DoWork);

        // Start the thread.
        workerThread.Start();

        while (!workerThread.IsAlive);
             // allow the worker thread to do some work:
             Thread.Sleep(1);

        // Request that the worker thread stop itself:
        workerObject.RequestStop();

        //Wait untill the worker thread joins it self to main thread
        workerThread.Join();

}

你会在 MSDN 上找到类似的示例,因为我在一年前在我的应用程序中实现它时参考了那里的代码。

干杯!!

【讨论】:

  • 感谢 cmets,线程在这里不是一个选项,因为我的问题是 tabControl 不想将项目加载到组合框中,直到标签页想要加载它们。我不喜欢我的表单/标签页出现,并且组合框仍在花时间获取项目。如果用户在页面显示后立即点击组合框怎么办?我没有使用 WPF 的经验,但值得一试。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 2014-08-31
  • 2011-03-14
  • 2014-04-01
  • 2018-06-24
  • 2016-12-14
  • 2019-02-12
相关资源
最近更新 更多