C# 在c中进行并行api调用并异步处理每个响应#

C# 在c中进行并行api调用并异步处理每个响应#,c#,xamarin.ios,xamarin.android,mvvmcross,C#,Xamarin.ios,Xamarin.android,Mvvmcross,我有一个场景,我需要在c#(Xamarin iOS和Xamarin Android)中并行地进行多个api调用(相同的api具有不同的参数)。我不想等待所有任务完成,相反,每当收到响应时,我都应该处理它并相应地更新UI 需要多次调用的方法 public async Task<Response> GetProductsAsync(int categoryId, int pageNo = -1, int pageSize = -1) { try

我有一个场景,我需要在c#(Xamarin iOS和Xamarin Android)中并行地进行多个api调用(相同的api具有不同的参数)。我不想等待所有任务完成,相反,每当收到响应时,我都应该处理它并相应地更新UI

需要多次调用的方法

public  async Task<Response> GetProductsAsync(int categoryId, int pageNo = -1, int pageSize = -1)
        {
            try
            {
                string url = "";
                if (pageNo == -1 || pageSize == -1)
                    url = $"catalog/v1/categories/{categoryId}/products";
                else
                    url = $"catalog/v1/categories/{categoryId}/products?page-number={pageNo}&page-size={pageSize}";
                var response = await client.GetAsync(url);
                string responseString = await response.Content.ReadAsStringAsync();
                GetParsedData(response.IsSuccessStatusCode, responseString);
            }
            catch (Exception e)
            {
                apiResponse.status = "internalError";
                apiResponse.data = e.Message;
            }
            return apiResponse;
        }
public异步任务GetProductsAsync(int-categoryId,int-pageNo=-1,int-pageSize=-1)
{
尝试
{
字符串url=“”;
如果(页面号==-1 | |页面大小==-1)
url=$“目录/v1/categories/{categoryId}/products”;
其他的
url=$“catalog/v1/categories/{categoryId}/products?页码={pageNo}&页面大小={pageSize}”;
var response=wait client.GetAsync(url);
string responseString=wait response.Content.ReadAsStringAsync();
GetParsedData(response.issusccessStatusCode,responseString);
}
捕获(例外e)
{
apiResponse.status=“internalError”;
apiResponse.data=e.消息;
}
返回响应;
}

通过调用函数,您可以编写如下代码

    public void CallingFunctionToGetProductsAsync() {
        Task.Run(async () =>
        {
            var response = await GetProductsAsync(1);
            ProcessResponse(response);
        });

        Task.Run(async () =>
        {
            var response = await GetProductsAsync(2);
            ProcessResponse(response);
        });
    }

通过调用函数,您可以编写如下代码

    public void CallingFunctionToGetProductsAsync() {
        Task.Run(async () =>
        {
            var response = await GetProductsAsync(1);
            ProcessResponse(response);
        });

        Task.Run(async () =>
        {
            var response = await GetProductsAsync(2);
            ProcessResponse(response);
        });
    }

这就是您可以异步等待多个任务并在其中任何任务完成时更新UI的方式

async Task GetSomeProductsAsync( IEnumerable<int> categoryIds )
{
    List<Task<Response>> tasks = categoryIds
        .Select( catId => GetProductsAsync( catId ) )
        .ToList();

    while ( tasks.Any() )
    {
        var completed = await Task.WhenAny( tasks );
        tasks.Remove( completed );
        var response = completed.Result;
        // update the ui from this response
    }
}

您可以在Stephen Cleary的博客文章中阅读更多关于它的信息:

这就是您可以异步等待多个任务并在其中任何任务完成时更新UI的方式

async Task GetSomeProductsAsync( IEnumerable<int> categoryIds )
{
    List<Task<Response>> tasks = categoryIds
        .Select( catId => GetProductsAsync( catId ) )
        .ToList();

    while ( tasks.Any() )
    {
        var completed = await Task.WhenAny( tasks );
        tasks.Remove( completed );
        var response = completed.Result;
        // update the ui from this response
    }
}
您可以在Stephen Cleary的博客文章中了解更多信息: