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