执行GetDataAsync时,在textbox1_Leave事件结束之前引发textBox1_Validating事件。我该怎样做才能防止这种情况发生?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private bool IsValid = true;
private async void textBox1_Leave(object sender, EventArgs e)
{
MessageBox.Show("Working");
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
IsValid = await client.CheckUser(textBox1.Text);
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if(IsValid)
MessageBox.Show("Welcome!");
else
e.Cancel = true;
}
}
答案 0 :(得分:2)
事件按以下顺序发生:
输入
的GotFocus
离开
验证
验证
- 醇>
引发LostFocus
当await
在Control.Leave
内时,你让UI消息泵继续执行,因此它会处理下一个事件。如果您想等到Leave
完成,请同步运行您的方法。
答案 1 :(得分:1)
控件的Validating
进程是一个同步进程,在继续之前,您不能等到从异步方法返回。 async
/ await
的要点是在您等待异步方法的结果时允许UI继续,因此一旦您在await
事件中Leave
,控件就会假定它#39; s完成并继续使用事件链的其余部分。
Validating
事件应该用于执行同步验证,如果您需要服务器验证,那么您只需要接受输入的文本有效且然后在Validated
事件中,您可以发送请求
private bool IsValid = false;
private void textBox1_Validated(object sender, EventArgs e)
{
this.ValidateUser(textBox1.Text);
}
private async void ValidateUser(string username)
{
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
IsValid = await client.CheckUser(textBox1.Text);
if (IsValid) {
MessageBox.Show("Welcome!");
} else {
MessageBox.Show("Invalid Username, try again!");
textBox1.Focus();
}
}