2013-07-23 78 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

相关问题