Предварительная загрузка всей основной формы, пока пользователи заполняют текстовое поле для входа - PullRequest
3 голосов
/ 07 ноября 2011

Мое приложение имеет ограниченный доступ.У меня есть окно с именем пользователя и паролем в небольшом диалоговом окне, и при входе в систему я загружаю очень большую форму с кучей элементов управления и несколькими большими сетками.Вся 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 Ответ

2 голосов
/ 07 ноября 2011

Вы можете создать свое окно входа в новую ветку в конструкторе главных окон

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...