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

时间:2012-03-26 20:30:30

标签: c# asynchronous event-handling

在C#中进行异步方法调用之后设置事件处理程序(或delagate)是否安全?例如,以下内容:

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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果Login在你打电话时开始工作,那么是 - 你手上有竞争条件。