我所拥有的是用户名的字符串属性,该字符串属性通过MVVM连接到文本条目,无论何时设置,我都会调用一种方法来检查服务器以查看用户名是否可用。现在,我不希望在每次键入键时都调用此方法,而是要它检测用户何时停止键入。
目前这是我的代码...
private string _username;
public string Username
{
get => _username;
set
{
SetProperty(ref _username, value);
Task.Run(async () => await CheckUsernameExists(1000));
}
}
然后使用CheckUsernameExists()方法...
/// <summary>
/// Checks if the username already exists
/// </summary>
/// <returns></returns>
public async Task CheckUsernameExists(int timeoutInMilliseconds)
{
await Task.Delay(timeoutInMilliseconds);
try
{...
但是,这不会重新触发,只会将呼叫延迟1秒。
我从虚幻引擎4(https://docs.unrealengine.com/en-US/BlueprintAPI/Utilities/FlowControl/RetriggerableDelay/index.html)提出了可重新触发的延迟的想法
UE4发生的事情是,该功能被调用一次。然后,它在可重新触发的延迟上启动计时器。如果在计时器运行时再次调用该函数,它将重新启动计时器。然后,仅在完成时才在其后调用代码。
有人知道如何在C#中执行此操作吗?谢谢!
这是开始对每种类型进行延迟检查的代码,但是只有最后一次调用才实际检查用户名:
private int _checkUsernameCalls = 0;
public string Username
{
get => _username;
set
{
SetProperty(ref _username, value);
_checkUsernameCalls++;
Task.Delay(TimeSpan.FromSeconds(1)).ContinueWith(t => CheckUsernameExists());
}
}
void CheckUsernameExists()
{
if (--_checkUsernameCalls > 0)
{
return;
}
// actual checks...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句