簡體   English   中英

使用委托調用異步方法

[英]Using delegates to call async methods

我正在調用async api以獲取詳細信息。 目標api端點可以更改,並希望將其作為動態函數傳遞。

由於所有API的詳細信息分頁都是相同的,我們如何使它成為具有async return value? 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;
}

類似於以下內容:

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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM