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

时间:2011-11-07 17:09:35

标签: c# winforms multithreading

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

问题是:当用户填写两个登录字段时,如何预先运行Form构造函数()?如果用户非常慢并且需要> 10秒才能完成身份验证,那么显示应用程序的速度就会快一些。

我认为这是可能的,因为它是两个单独的顶级窗口,但我不知道如何实现它。 BackgroundWorker,新主题,...?任何线索?

解决方案:

按照Eamonn McEvoy的例子,我添加了一些关于我的先决条件的修正:我想只显示登录对话框,如果记录成功,我会显示大表格。

[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();
    }
}

1 个答案:

答案 0 :(得分:2)

您可以在主窗口构造函数

的新线程中创建登录窗口
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();
}