【问题标题】:Using delegates to call async methods使用委托调用异步方法
【发布时间】:2019-07-26 10:23:14
【问题描述】:

我正在调用async api 来获取详细信息。 目标api 端点可以更改并希望将其作为动态函数传递。

既然所有api的细节分页都是一样的,我们如何才能使它成为delegate函数和async return value?

private async Task<List<Items>> GetItemsAsync(HttpClient client, string arg1)
{
    var totalResults = new List<Items>();
    int skip = 0, resultsCount = 1;

    while (resultsCount != 0)
    {
        var results = await GetItems(client, arg1, skip);
        if (results != null)
        {
            totalResults.AddRange(results);
            resultsCount = results.Count;
            skip += resultsCount;
        }
        else
        {
            resultsCount = 0;
        }
    }

    return totalResults;
}

private async Task<List<Users>> GetUsersAsync(HttpClient client, string arg1)
{
    var totalResults = new List<Users>();
    int skip = 0, resultsCount = 1;

    while (resultsCount != 0)
    {
        var results = await GetUsers(client, arg1, skip);
        if (results != null)
        {
            totalResults.AddRange(results);
            resultsCount = results.Count;
            skip += resultsCount;
        }
        else
        {
            resultsCount = 0;
        }
    }

    return totalResults;
}

【问题讨论】:

    标签: c# asynchronous delegates


    【解决方案1】:

    类似于以下内容:

    private async Task<List<T>> Get<T>(Func<Task<int, int, List<T>>> factory, int skip, int take)
    {
        var totalResults = new List<T>();
        var resultsCount = 1;
    
        while (resultsCount != 0)
        {
            var results = await factory(skip, take);
            if (results != null)
            {
                totalResults.AddRange(results);
                resultsCount = results.Count;
                skip += resultsCount;
            }
            else
            {
                resultsCount = 0;
            }
        }
    
        return totalResults;
    }
    
    public Task<List<User>> GetUsersAsync(HttpClient httpClient, string arg1)
    {
        return Get<User>((skip, take) => GetUsers(httpClient, arg1, skip, take), 0, 10);
    }
    
    public Task<List<Item>> GetItemsAsync(HttpClient httpClient, string arg1)
    {
        return Get<Item>((skip, take) => GetItems(httpClient, arg1, skip, take), 10, 10);
    }
    

    在某些情况下,以下可能也足够了,但显然不是您的情况,因为您似乎需要对 skip 参数做更多的事情:

    private async Task<List<T>> Get<T>(Func<Task<List<T>>> factory)
    {
        ...
    }
    
    public Task<List<User>> GetUsersAsync(HttpClient httpClient, string arg1)
    {
        return Get<User>(() => GetUsers(httpClient, arg1, 0, 10));
    }
    
    public Task<List<Item>> GetItemsAsync(HttpClient httpClient, string arg1)
    {
        return Get<Item>(() => GetItems(httpClient, arg1, 10, 10));
    }
    

    【讨论】:

    • 遗漏了一些小细节。我需要从代表那里传递skip 参数,这是我苦苦挣扎的地方
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多