0

ログインが完了するたびに実行されるカスタム イベント ハンドラが繰り返されます。

それ自体を繰り返すとは、イベントが最初に発生したときに、ハンドラーが 1 回だけ実行されることを意味します。しかし、イベントが 2 回目に発生すると、ハンドラは 2 回実行されます。イベントが 3 回目に発生すると、ハンドラーは 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;
    }
4

2 に答える 2

2

購読する前に購読を解除してください。

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

まだ購読していない場合は何もしませんが、購読している場合は、2 回購読していないことが保証されます。他の問題については、上記を実行した後にサブスクライブを解除する他のコード行を削除するだけで解決できる場合があります。

于 2013-07-23T05:29:15.947 に答える