关于如何防止GUI冻结的C#问题,但仍然处于阻塞状态

时间:2010-01-28 04:46:11

标签: c# user-interface backgroundworker

我正在尝试创建一个登录表单。我遇到的问题是登录过程耗时太长并且锁定了我的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;
    }
}

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

一般步骤如下:

  1. 将后台工作程序添加到“登录”对话框
  2. 为后台工作者的DoWork事件创建一个事件处理程序,该事件处理程序调用您验证委托。
  3. 在btnLogin_Click中禁用“登录”对话框,以便在后台工作人员运行时用户无法再次单击登录。
  4. 在btlLogin_Click中调用BackGround worker的RunWorkAsync方法以启动worker运行。
  5. 为Background Worker的RunWorkerCompleted事件创建事件处理程序。在该事件中启用LoginForm并在登录结果成功时关闭对话框或显示错误消息。

答案 1 :(得分:0)

我想说在登录表单中创建一个事件并在主表单中订阅。在登录表单中,如果花费的时间太长,您可以使用该线程执行登录任务。登录成功或失败后,您可以使用此事件通知主表单,并将事件参数中的其他信息发送到主表单。

收到此事件后,主表格可以根据您设定的条件继续进行。

答案 2 :(得分:0)

禁用相关的UI元素(按钮,文本字段等),然后启动后台工作线程。完成后,根据需要更新UI。

与用户界面进行通信可以采用LoginSucceededLoginFailed事件的形式,也可以采用类似的方式。