2013-07-23 96 views
0

我的自定義事件處理程序在執行完登錄後自動執行。自定義事件處理程序正在重複自己

通過重複自身,我的意思是在第一次發生事件時,處理程序只執行一次。但是,當事件再次發生時,處理程序執行2次!當事件第三次發生時,處理程序執行3次,依此類推。

這是我的代碼。任何我忽略的東西?

訂閱事件

SignIn signIn = new SignIn(); 
signIn.Login_Complete += new SignIn.EventHandler(recieveLoginResult); 
pb.IsVisible = true; 
signIn.Login(control.username.Text, control.password.Password); 

事件

class SignIn 
{ 
    public event EventHandler Login_Complete; 
    public event EventHandler Logout_Complete; 
    public event EventHandler Signup_Complete; 
    public delegate void EventHandler(Object sender, String message); 

... 

    public void Login(String username, String password) 
    { 
     Dictionary<string, object> parameters = new Dictionary<string, object>(); 
     parameters.Add("user", username); 
     parameters.Add("pass", password); 

     PostClient client = new PostClient(parameters); 
     client.DownloadStringCompleted += (senders, ex) => 
      { 
       if (ex.Error == null) 
       { 
        //Process the result... 
        Login_Complete(this, ex.Result); 
       } 
       else 
       { 
        Login_Complete(this, "An error occurred. The details of the error: " + ex.Error); 
       } 
      }; 
     client.DownloadStringAsync(new Uri("(SOME URL HERE)", UriKind.Absolute)); 
    } 

事件處理

private void recieveLoginResult(object sender, String loginResult) 
    { 
     SignIn signin = new SignIn(); 
     signin.Login_Complete -= recieveLoginResult; 

     //Check if the result is numeric or not. 
     bool textIsNumeric = true; 
     try 
     { 
      int.Parse(loginResult); 
     } 
     catch 
     { 
      textIsNumeric = false; 
     } 

     if (textIsNumeric == true) 
     { 
      //Logged in successfully. 
      popup.IsOpen = false; 
      loginName.Text = control.username.Text; 
      sessionID = int.Parse(loginResult); 
     } 
     else 
     { 
      //Did not log in successfully. 
      MessageBox.Show(loginResult, "Error", MessageBoxButton.OK); 
     } 

     pb.IsVisible = false; 
    } 

回答

2

在訂閱前取消訂閱。

SignIn signIn = new SignIn(); 
signIn.Login_Complete -= recieveLoginResult; 
signIn.Login_Complete += recieveLoginResult; 
pb.IsVisible = true; 
signIn.Login(control.username.Text, control.password.Password); 

它不會做任何事情,如果它不是已經認購,但如果它會確保你沒有訂閱的兩倍。至於您的其他問題,您可以通過刪除在執行上述操作後取消訂閱的其他代碼來解決問題。

+0

謝謝你。我這樣做,也阻止了我的按鈕單擊事件處理程序重複,直到它完成(使用布爾變量isLoggingIn)。現在,問題解決了! [現在] – kdh

+0

@AndrewKim,你可能有其他問題,通常不需要這樣做。我的意思是刪除事件處理程序,然後將其添加回來。 – seshuk

0

製作確定您要從您訂閱的同一對象中刪除事件處理程序。看起來您正在創建一個新對象來取消訂閱該事件。

SignIn signIn = new SignIn(); 
signIn.Login_Complete += new SignIn.EventHandler(recieveLoginResult); 


SignIn signin = new SignIn(); // this could be the problem...*** 
    signin.Login_Complete -= recieveLoginResult; 
+0

剛剛嘗試過。我改變了它,所以現在登錄是一個私人對象,並取消訂閱/訂閱訪問該私人對象。 – kdh

+0

新問題是當我嘗試第二次訂閱時出現NullReferenceException。 贊,我按登錄按鈕並登錄。之後,我註銷。此事件處理程序已經取消訂閱。我嘗試第二次再次登錄,現在我面臨NullReferenceException。 – kdh

相關問題