C# 在c中进行并行api调用并异步处理每个响应#
我有一个场景,我需要在c#(Xamarin iOS和Xamarin Android)中并行地进行多个api调用(相同的api具有不同的参数)。我不想等待所有任务完成,相反,每当收到响应时,我都应该处理它并相应地更新UI 需要多次调用的方法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
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的博客文章中了解更多信息: