我正在尝试创建一个登录表单。我遇到的问题是登录过程耗时太长并且锁定了我的GUI。我已经阅读了后台工作者,但我仍然不确定如何让我的程序等待登录过程但不冻结我的GUI。这是我的代码,以帮助解释它。
Login.cs
public partial class Login : Form
{
public delegate bool Authenicate(string account, string password,string type);
public Authenicate authenicate;
public Login()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
if (txtAccount.Text == string.Empty)
{
MessageBox.Show("Must include account number", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (txtPassword.Text == string.Empty)
{
MessageBox.Show("Must include password", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!authenicate(txtAccount.Text, txtPassword.Text,cmbType.Items[cmbType.SelectedIndex].ToString()))
{
return;
}
this.DialogResult = DialogResult.OK;
}
private void Login_Load(object sender, EventArgs e)
{
cmbType.SelectedIndex = 0;
}
MainForm.cs
public partial class MainForm: Form
{
Ex.Service myService=new Ex.Service();
public MainForm()
{
InitializeComponent();
}
public bool Authenicate(string account, string password,string type)
{
try
{
//Login takes too long and locks up GUI
//Maybe try background worker, but how to wait until
//login is complete?
myService.Login(account,password,type);
return myService.IsLogin();
}
catch(Exception exception)
{
MessageBox.Show(exception.message);
}
return false;
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
myService.Logout(); //Logout from service
myService = null;
}
}
感谢您的时间。
答案 0 :(得分:1)
一般步骤如下:
答案 1 :(得分:0)
我想说在登录表单中创建一个事件并在主表单中订阅。在登录表单中,如果花费的时间太长,您可以使用该线程执行登录任务。登录成功或失败后,您可以使用此事件通知主表单,并将事件参数中的其他信息发送到主表单。
收到此事件后,主表格可以根据您设定的条件继续进行。
答案 2 :(得分:0)
禁用相关的UI元素(按钮,文本字段等),然后启动后台工作线程。完成后,根据需要更新UI。
与用户界面进行通信可以采用LoginSucceeded
和LoginFailed
事件的形式,也可以采用类似的方式。