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