C# 在用户填写登录文本框时预加载整个主窗体

C# 在用户填写登录文本框时预加载整个主窗体,c#,winforms,multithreading,C#,Winforms,Multithreading,我的应用程序具有受限访问权限。我在一个小对话框中有一个用户/密码框,登录时,我正在加载一个非常大的表单,其中包含大量控件和几个大网格。整个InitializeComponent()在没有任何数据的情况下加载几乎需要10秒 问题是:当用户填写两个登录字段时,如何预运行表单构造函数()?若用户速度非常慢,并且需要>10秒才能完成身份验证,那个么它将像眨眼一样快速地显示应用程序 我认为这是可能的,因为它是两个独立的顶级窗口,但我不知道如何实现它。后台工作人员,新线程?有线索吗 解决方案: 按照Eamo

我的应用程序具有受限访问权限。我在一个小对话框中有一个用户/密码框,登录时,我正在加载一个非常大的表单,其中包含大量控件和几个大网格。整个InitializeComponent()在没有任何数据的情况下加载几乎需要10秒

问题是:当用户填写两个登录字段时,如何预运行表单构造函数()?若用户速度非常慢,并且需要>10秒才能完成身份验证,那个么它将像眨眼一样快速地显示应用程序

我认为这是可能的,因为它是两个独立的顶级窗口,但我不知道如何实现它。后台工作人员,新线程?有线索吗

解决方案:

按照Eamonn McEvoy的示例,我添加了一些关于prerequesites的修复:我只想显示登录对话框,如果登录成功,我会显示大表单

[STAThread]
static void Main()
{
    Launcher context = new Launcher();
    Application.Run(context);
}


public class Launcher : ApplicationContext
{
    private BigForm _bigForm;
    private Thread _loginThread;
    private SynchronizeLogin _sharedLogin;

    public class SynchronizeLogin
    {
        private bool _waited = false;
        public bool IsInitialized
        {
            get // loginform should wait before closing until return true
            {
                lock (this)
                {
                    return _waited;
                }
            }
            set // must be set when bigform is initialized
            {
                lock (this)
                {
                    _waited = value;
                }
            }
        }

        private DialogResult _logged = DialogResult.None;
        public DialogResult loginResult
        {
            get // wait until loginform close
            {
                lock (this)
                {
                    if (_logged != DialogResult.None)
                        return _logged;
                    else
                    {
                        Monitor.Wait(this);
                        return _logged;
                    }
                }
            }
            set // set from loginform when closing
            {
                lock (this)
                {
                    _logged = value;
                    Monitor.Pulse(this);
                }
            }
        }
    }

    public Launcher()
    {
        // sync obj between forms
        _sharedLogin = new SynchronizeLogin();
        _loginThread = new Thread(new ThreadStart(LaunchLogin));
        _loginThread.Start();

        // first form
        _bigForm= new BigForm(_sharedLogin);
        _bigForm.Closed += new EventHandler(OnFormClosed);

        // notify login thread that the main one is ready
        // from now, the login form should be near closing
        _sharedLogin.IsInitialized = true;

        WaitLogon();
    }

    private void WaitLogon()
    {
        if (_sharedLogin.loginResult == DialogResult.OK)
        {
            _bigForm.LoginSuccessful(); // read and use auth session
            _bigForm.Show();
        }
        else
        {
            // escape on user login form
            // (other exit calls are not working in ctor)
            Environment.Exit(42);
        }
    }

    private void LaunchLogin()
    {
        // ask user
        LoginDialog _loginForm = new LoginDialog (_sharedLogin);
        _sharedLogin.loginResult = _loginForm.ShowDialog();

        // userlogin form closed
        // end only current thread
        Application.ExitThread();
    }

    private void OnFormClosed(object sender, EventArgs e)
    {
        // big form closed
        // end ApplicationContext globally
        base.ExitThread();
    }
}

您可以从主windows构造函数在新线程中创建登录窗口

using System.Threading;

private AuthSession _authSession;

public MainWindowConstructor()
{ 
    Thread loginThread = new Thread(new ThreadStart(Login());
    loginThread.Start();
    //Continue initializing
}

private void Login()
{
    LoginWindow loginWindow = new LoginWindow();
    _authSession = loginWindow.GetAuthSession();
    loginWindow.Close();
}

美好的你知道我应该如何将我从LoginWindow创建的auth会话转发到MainWindow吗?@Doomsday查看我的编辑,让我知道这是否有效。或者,您可以使用后台工作程序并在RunWorkerCompleted方法中返回AuthSession。