c# - Xamarin PCL - 根据用户输入进行 API 调用,如何抑制请求?

标签 c# .net search xamarin portable-class-library

我有一个搜索任务,在可移植类库中向 API 发出请求,当用户在文本框中输入文本时,这按预期工作,但我担心大规模性能。当我们拥有庞大的用户群时,每次按键时都会向此 API 发出请求,我可以预见到性能问题。

我已将 API 调用限制为仅在超过三个有效字符时触发,但我想进一步抑制这种情况。我可以在此基础上实现一个计时器,但感觉它不是一个好的解决方案,并且不存在于 PCL 框架中。

是否有推荐的模式来实现这种类型的请求抑制?

    private async Task GetClubs()
    {
        try
        {
            if (!string.IsNullOrWhiteSpace(ClubSearch) && ClubSearch.Replace(" ", "").Length >= 3)
            {
                Clubs = await dataService.GetClubs(ClubSearch);
            }
        }
        catch (DataServiceException ex)
        {
            ...
        }
    }

最佳答案

通常这是通过计时器完成的。当搜索文本更改时,您启动(或重复使用)一个计时器,该计时器将在延迟后触发并执行搜索请求。如果在该延迟期间键入了更多文本 - 计时器将重置。示例代码:

public class MyClass {
    private readonly Timer _timer;
    const int ThrottlePeriod = 500; // ms
    public MyClass() {
        _timer = new System.Threading.Timer(_ => {
            ExecuteRequest();
        }, null, Timeout.Infinite, Timeout.Infinite);
    }

    private string _searchTerm;
    public string SearchTerm
    {
        get { return _searchTerm; }
        set
        {
            _searchTerm = value;
            ResetTimer();
        }
    }

    private void ResetTimer() {
        _timer.Change(ThrottlePeriod, Timeout.Infinite);
    }

    private void ExecuteRequest() {
        Console.WriteLine(SearchTerm);
    }
}

如果定时器不可用,你可以用 Task.Delay 做同样的事情:

public class MyClass
{        
    const int ThrottlePeriod = 500; // ms
    private string _searchTerm;
    public string SearchTerm
    {
        get { return _searchTerm; }
        set
        {
            _searchTerm = value;
            SearchWithDelay();              
        }
    }

    private async void SearchWithDelay() {
        var before = this.SearchTerm;
        await Task.Delay(ThrottlePeriod);
        if (before == this.SearchTerm) {
            // did not change while we were waiting
            ExecuteRequest();
        }
    }        

    private void ExecuteRequest()
    {
        Console.WriteLine(SearchTerm);
    }
}

关于c# - Xamarin PCL - 根据用户输入进行 API 调用,如何抑制请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071302/

相关文章:

c# - 我将如何反转这个看起来简单的算法?

c# - TransactionScope 提交更新而不调用 .Complete() 但不插入

c# - 如何编写多行 RegEx 表达式

android - 如何在 Textview 中搜索单词?

c# - 从 C# 类中提取数据属性显示名称?

c# - 查询 dns 别名

c# - 如何在 COmpact Framework 中将 ControlBox 设置为 false 时保留 ControlBox UI 感觉(win mobile)

C# DLL 配置文件不存在

c - 二叉树的通用 C

java - BST 数据结构 -- 类项目 -- 访问嵌套类