如何实现和异步电子邮件验证逻辑?
How to implement and async email verification logic?
我需要执行以下操作:我有一个用户可以输入电子邮件的页面。每次文本更改时,我都必须检查用户是否存在于数据库中,并根据该信息将按钮的文本设置为 "Sign up" 或 "Sign in"。问题是,这个数据库请求可能需要几秒钟(原因无关紧要)并且 API 是异步的,因此事件处理程序将用 async
修饰,并且由于邮件条目可能会更改几个次,此处理程序将在任何一个结束之前被调用多次。因此,我将有并发的 API 请求,然后可能会同时尝试更改按钮文本,但结果可能不会很好。我想到了这样的事情:
private async void OnTextChanged(object sender, TextChangedEventArgs e)
{
mailEntry.TextChanged -= OnTextChanged;
...
submitButton.Text = (await api.AccountExistAsync(mailEntry.Text)).IsRegistered
? "Sign in"
: "Sign up";
...
mailEntry.TextChanged += OnTextChanged;
}
但是这种设计的一个问题是,比如说,在 -= OnTextChanged
和 += OnTextChanged
之间输入了一个有效的电子邮件,在这种情况下,它永远不会被检查。
我的问题是,实现我想要实现的目标的正确方法是什么?提前致谢。
这是一种解决方案:
private long requestNumber;
private async void OnTextChanged(object sender, TextChangedEventArgs e)
{
var text = mailEntry.Text;
long myRequestNumber = ++requestNumber;
await Task.Delay(200);
if (requestNumber != myRequestNumber)
return;
var result = (await api.AccountExistAsync(text)).IsRegistered;
if (requestNumber != myRequestNumber)
return;
submitButton.Text = result ? "Sign in" : "Sign up";
}
它维护一个 requestNumber
变量来保存每次更改文本时递增的最后一个请求编号。
如果在AccountExistAsync
操作完成后,代码发现变量被更改,它会断定发出了新的请求,并且不会更新UI。
请注意,该解决方案在尝试发送验证请求之前还会等待 200 毫秒。虽然这会延迟验证操作 200 毫秒,但会防止发送太多请求,尤其是在用户快速输入时。这当然是可选的。
编辑:
我在 reading/updating requestNumber
时删除了同步的使用,因为这样的代码仅在 UI 线程中运行。
我需要执行以下操作:我有一个用户可以输入电子邮件的页面。每次文本更改时,我都必须检查用户是否存在于数据库中,并根据该信息将按钮的文本设置为 "Sign up" 或 "Sign in"。问题是,这个数据库请求可能需要几秒钟(原因无关紧要)并且 API 是异步的,因此事件处理程序将用 async
修饰,并且由于邮件条目可能会更改几个次,此处理程序将在任何一个结束之前被调用多次。因此,我将有并发的 API 请求,然后可能会同时尝试更改按钮文本,但结果可能不会很好。我想到了这样的事情:
private async void OnTextChanged(object sender, TextChangedEventArgs e)
{
mailEntry.TextChanged -= OnTextChanged;
...
submitButton.Text = (await api.AccountExistAsync(mailEntry.Text)).IsRegistered
? "Sign in"
: "Sign up";
...
mailEntry.TextChanged += OnTextChanged;
}
但是这种设计的一个问题是,比如说,在 -= OnTextChanged
和 += OnTextChanged
之间输入了一个有效的电子邮件,在这种情况下,它永远不会被检查。
我的问题是,实现我想要实现的目标的正确方法是什么?提前致谢。
这是一种解决方案:
private long requestNumber;
private async void OnTextChanged(object sender, TextChangedEventArgs e)
{
var text = mailEntry.Text;
long myRequestNumber = ++requestNumber;
await Task.Delay(200);
if (requestNumber != myRequestNumber)
return;
var result = (await api.AccountExistAsync(text)).IsRegistered;
if (requestNumber != myRequestNumber)
return;
submitButton.Text = result ? "Sign in" : "Sign up";
}
它维护一个 requestNumber
变量来保存每次更改文本时递增的最后一个请求编号。
如果在AccountExistAsync
操作完成后,代码发现变量被更改,它会断定发出了新的请求,并且不会更新UI。
请注意,该解决方案在尝试发送验证请求之前还会等待 200 毫秒。虽然这会延迟验证操作 200 毫秒,但会防止发送太多请求,尤其是在用户快速输入时。这当然是可选的。
编辑:
我在 reading/updating requestNumber
时删除了同步的使用,因为这样的代码仅在 UI 线程中运行。