自定义事件处理程序正在重复自身

本文关键字:事件处理 程序 自定义 | 更新日期: 2023-09-27 18:24:16

每当登录完成时执行的自定义事件处理程序正在重复。

通过重复本身,我的意思是在事件第一次发生时,处理程序只执行一次。但是,当事件第二次发生时,处理程序执行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;
    }

自定义事件处理程序正在重复自身

在订阅前取消订阅。

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

如果它还没有订阅,它不会做任何事情,但如果订阅了,它会确保你不会订阅两次。至于你的另一个问题,你可以通过删除在完成上述操作后取消订阅的另一行代码来解决。

确保您正在从订阅的同一对象中删除事件处理程序。看起来您正在创建新对象以取消订阅该事件。

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

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