2010-01-28 4 views
1

로그인 양식을 만들려고합니다. 내가 가지고있는 문제는 로그인 프로세스가 너무 오래 걸리고 내 GUI를 잠그고 있다는 것입니다. 나는 백그라운드 작업자에 대해 읽었지만, 내 프로그램이 로그인 프로세스를 기다리는 방법에 대해서는 여전히 불확실하지만 내 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; 
    } 
} 

는 시간 내 주셔서 감사합니다.

답변

1

일반적인 단계는 다음과 같습니다

  1. 당신이 대리자를 인증 호출하는 배경 노동자의 DoWork 이벤트에 대한 이벤트 처리기를 작성 대화 상자 로그인에 배경 작업자를 추가합니다.
  2. btnLogin_Click에서 로그인 대화 상자를 사용하지 않도록 설정하여 배경 작업자가 로그인하는 동안 다시 로그인 할 수 없습니다.
  3. btlLogin_Click에서는 BackGround 작업자의 RunWorkAsync 메서드를 호출하여 실행중인 작업자를 시작합니다.
  4. 백그라운드 작업자의 RunWorkerCompleted 이벤트에 대한 이벤트 처리기를 만듭니다. 이 경우 LoginForm을 사용 가능하게하고 로그인 결과가 성공하면 대화 상자를 닫거나 en 오류 메시지를 표시하십시오.
+0

명확하고 유용한 답변을 제공해 주셔서 감사합니다. – Dylan

0

로그인 양식에 이벤트를 만들고 기본 양식으로 구독한다고 말합니다. 로그인 양식 내에서 스레드를 사용하여 로그인 작업을 수행하는 데 너무 오래 걸리는 경우이를 수행 할 수 있습니다. 로그인이 성공하거나 실패하면이 이벤트를 기본 양식에 사용하여 알리고 기본 양식에 대한 이벤트 인수에 추가 정보를 보낼 수 있습니다.

이 이벤트를 수신하면 기본 양식은 귀하가 설정 한 조건에 따라 진행될 수 있습니다.

0

관련 UI 요소 (버튼, 텍스트 필드 등)를 비활성화 한 다음 배경 작업자 스레드를 위로 돌립니다. 완료되면 UI를 적절하게 업데이트하십시오.

UI와 통신하는 것은 LoginSucceededLoginFailed 이벤트의 형태를 취할 수도 있고 유사 할 수도 있습니다.

관련 문제