C# 控件在多线程处理窗体时不加载

C# 控件在多线程处理窗体时不加载,c#,multithreading,winforms,forms,C#,Multithreading,Winforms,Forms,我有一个WinC窗体应用程序。当主窗体加载时,会加载并隐藏另外两个窗体,因为我需要它们在后台运行。为了能够访问它们,我保留了两个指向它们的全局变量。我想在一个单独的线程上加载它们,以减少加载时间。为此,我在主窗体的构造函数中有以下代码: if (!IsHandleCreated) { CreateHandle(); } //Start the license manager using a separate thread. new Thread(delegate() { Beg

我有一个WinC窗体应用程序。当主窗体加载时,会加载并隐藏另外两个窗体,因为我需要它们在后台运行。为了能够访问它们,我保留了两个指向它们的全局变量。我想在一个单独的线程上加载它们,以减少加载时间。为此,我在主窗体的构造函数中有以下代码:

if (!IsHandleCreated)
{
    CreateHandle();
}

//Start the license manager using a separate thread.
new Thread(delegate()
{
    BeginInvoke(new Action(() =>
    {
        GlobalVariables.licenseManagerWindow = new LicenseManager();
        GlobalVariables.licenseManagerWindow.Show();
    }));
    bt_Licenses.BeginInvoke(new Action(() =>
    {
        bt_Licenses.Enabled = true;
    }));
}).Start();

//Start the employee app manager using a separate thread.
new Thread(delegate()
{
    BeginInvoke(new Action(() =>
    {
        GlobalVariables.employeeAppManagerWindow = new ManageEmployeeApp();
        GlobalVariables.employeeAppManagerWindow.Show();
    }));
    bt_Employees.BeginInvoke(new Action(() =>
    {
        bt_EmployeeApp.Enabled = true;
    }));
}).Start();
问题在于,在加载每个表单后,主表单看起来不是显示主表单,而是更新按钮,直到加载其他两个表单:


正如您所看到的,这些控件不加载,并且显示透明。最终,当两个表单加载时,它们都加载良好。如果我注释掉上面的代码,那么主窗体的加载将非常好。显然,我不希望用户在加载表单时看到这个框架,而是希望看到控件。我做错了什么?

尝试使用后台工作程序而不是线程。使用报告进度/runworkercomplete事件将结果写入表单。这可以防止UI在线程完成之前等待绘图,并且不必手动处理控件的调用


可以在这里找到文档和示例:

不要在主窗体的构造函数中加载两个隐藏窗体,而是在主窗体的加载事件处理程序中加载


Windows强制您通过主线程加载隐藏表单BeginInvoke就是这样做的,但是,您可以通过让隐藏窗体从隐藏窗体的加载事件启动后台线程上的长时间网络通信来最小化对主线程的影响。

您正在从窗体的UI线程构造函数创建线程,该构造函数仅在窗体上使用BeginInvoke调度UI线程上的工作。那太没意义了,很公平。做我想做的事情的正确方法是什么?我不确定当你不使用线程时,你最初的问题是什么。如果我不使用线程,我的主窗体需要等待这两个其他窗体加载。他们正在进行大量的网络通信,因此需要花费大量的时间。我想在单独的线程上加载它们,以便我的主窗体加载得更快。此外,我想存储指向两个窗体的指针,这两个窗体应该可以从UI线程访问,因此需要使用调用。如果注释掉员工和许可证窗体,主窗体的控件是否正确显示?如果加载了许多类,并且第一次调用了许多方法,那么您可能会看到抖动造成的延迟。尝试使用表单计时器将员工和许可证表单的加载延迟100毫秒。在主窗口的加载事件处理程序中启动表单计时器。