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