Безопасно ли устанавливать обработчик событий (или отлагать) ПОСЛЕ асинхронного вызова метода в C #? - PullRequest
1 голос
/ 27 марта 2012

Безопасно ли устанавливать обработчик событий (или откладывать) ПОСЛЕ асинхронного вызова метода в C #?Например, следующее:

LoginOperation lo = WebContext.Current.Authentication.Login(new LoginParameters(UserName_Email.Text, UserPassword.Password));
lo.Completed += new EventHandler((object sender, EventArgs e) =>
    {
        if ((sender as LoginOperation).LoginSuccess)
        {
            //MessageBox.Show("Login Success");
            this.DialogResult = true;
            InitializeUserAccount(UserName_Email.Text);

        }
        else
        {
            MessageBox.Show("Login Failed");
        }

    });

В этом примере я устанавливаю обработчик события loginoperation ПОСЛЕ того, как я выполняю асинхронный вызов.Это всегда работает, но я не знаю, настроил ли я условие гонки?(и установка обработчика всегда побеждает в гонке).ИЛИ ... делать асинхронные вызовы, как-то отправленные после того, как текущий поток выполнения простаивает (или что-то в этом роде)?

Я делаю это для удобства чтения кода.Просто интересно, если я устроюсь здесь ...

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Нет, это не так. Теоретически, если переключение контекста произошло после вызова Login, но до подключения события Completed, логика входа в систему может завершиться до того, как управление вернется в исходный поток. Таким образом, обработчик события не может быть вызван.

В этом конкретном случае, вероятно, вы никогда не увидите проблемы, потому что Login занимает относительно большое количество времени для завершения. Таким образом, крайне маловероятно, что он завершится до того, как обработчик событий будет подключен. Я бы классифицировал как бомбу замедленного действия.

0 голосов
/ 27 марта 2012

Если Login начинает работать, когда вы звоните, то да - у вас есть состояние гонки в ваших руках.

...