C # вопрос о том, как предотвратить зависание GUI, но все еще оставаться в заблокированном состоянии - PullRequest
1 голос
/ 28 января 2010

Я пытаюсь создать форму входа. Проблема, с которой я сталкиваюсь, заключается в том, что процесс входа в систему занимает слишком много времени и блокирует мой графический интерфейс. Я прочитал о фоновом работнике, но я все еще не уверен, как заставить мою программу ждать процесс входа в систему, но не останавливать мой графический интерфейс. Вот мой код, чтобы помочь объяснить это больше.

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 ]

1 голос
/ 28 января 2010

Основные шаги:

  1. Добавление фонового редактора в диалоговое окно входа в систему
  2. Создайте обработчик события для события DoWork Фонового работника, который вызывает вас для аутентификации делегата.
  3. В btnLogin_Click отключите диалоговое окно входа в систему, чтобы пользователь не мог щелкнуть имя входа еще раз, пока работает фоновый рабочий.
  4. В btlLogin_Click вызовите метод RunWorkAsync работника BackGround, чтобы запустить работника.
  5. Создание обработчика событий для события RunWorkerCompleted Фонового работника. В этом случае включите LoginForm и закройте диалоговое окно, если результат входа был успешным, или отобразите сообщение об ошибке.
0 голосов
/ 28 января 2010

Отключите соответствующие элементы интерфейса (кнопки, текстовые поля и т. Д.), А затем раскрутите фоновый рабочий поток. По завершении обновите пользовательский интерфейс соответствующим образом.

Связь с пользовательским интерфейсом может принимать форму событий LoginSucceeded и LoginFailed или аналогично.

0 голосов
/ 28 января 2010

Я бы сказал, создать событие в форме входа и подписаться в основной форме. В форме входа в систему вы можете использовать поток для выполнения задачи входа в систему, если это занимает слишком много времени. После успешного входа или неудачного входа вы можете уведомить об этом событии в главной форме и отправить дополнительную информацию в аргументах события в главную форму.

После получения этого события основная форма может затем действовать в соответствии с заданными вами условиями.

...