在C#中异步方法调用之后设置事件处理程序(或委托)是否安全

本文关键字:安全 是否 程序 事件处理 异步方法 调用 设置 之后 | 更新日期: 2023-09-27 18:29:08

在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事件处理程序。这总是有效的,但我不知道我是否基本上设置了比赛条件?(设置处理程序总是赢得比赛)。或者。。。异步调用是否在当前执行线程空闲(或类似情况)后以某种方式调度?

我这样做是为了代码的可读性。只是想知道我是不是在这里安身立命。

在C#中异步方法调用之后设置事件处理程序(或委托)是否安全

不,不是。理论上,如果上下文切换发生在Login调用之后,但在连接Completed事件之前,则登录逻辑可能会在控制返回到原始线程之前完成。因此,可能不会调用事件处理程序。

然而,在这种特殊的情况下,您可能永远不会看到问题,因为Login需要相对较长的时间才能完成。因此,它极不可能在事件处理程序连接之前完成。不过,我认为这是一颗定时炸弹。

如果Login在您调用它时开始工作,那么是的-您手头有一个竞赛条件。