在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事件处理程序。这总是有效的,但我不知道我是否基本上设置了比赛条件?(设置处理程序总是赢得比赛)。或者。。。异步调用是否在当前执行线程空闲(或类似情况)后以某种方式调度?
我这样做是为了代码的可读性。只是想知道我是不是在这里安身立命。
不,不是。理论上,如果上下文切换发生在Login
调用之后,但在连接Completed
事件之前,则登录逻辑可能会在控制返回到原始线程之前完成。因此,可能不会调用事件处理程序。
然而,在这种特殊的情况下,您可能永远不会看到问题,因为Login
需要相对较长的时间才能完成。因此,它极不可能在事件处理程序连接之前完成。不过,我认为这是一颗定时炸弹。
如果Login
在您调用它时开始工作,那么是的-您手头有一个竞赛条件。