Blazor, Httpclient, sync and async WebApi calls



我是Blazor wasm的新手。 实际上,我将HttpClient作为单例添加到program.cs中的服务中。然后我使用一个通用实用程序类(HttpService),其中注入HttpClient来执行http调用(GetAsync,PostAsync,...)。我到处都使用异步等待模式。 第一种情况:在某些页面中,我应该同时进行Webapi调用,然后在所有调用完成后对结果进行一些计算。 第二种情况:在其他页面中,我有相反的需求,做一个电话,等待结果,然后将其用于第二个电话。

我尝试并注意到我的代码带有以下调用:

HttpService:

public async Task<dataDTO> GetData(int id)
{
var httpResponse = await httpService.Get<DataDTO>($"{baseURL}/{id}");
if (!httpResponse.Success)
{
var msg = await httpResponse.GetBody();
throw new ApplicationException(msg);
}
return httpResponse.Response;
}

并在页面组件中调用:

var result1 = await GetData(5000);
var result2 = await GetData(2000);
var result3 = await GetData(500);

假设参数是服务器用于延迟响应的毫秒。 这些调用始终是同步的。下一个等待前一个的结束被执行。(第二种情况)。

如何实现第一种情况(同时调用)?

谢谢。

您可以使用Task.WhenAll来允许它们同时运行:

dataDTO[] results = await Task.WhenAll(GetData(5000), GetData(2000), GetData(500));

这将创建一个新Task,该在完成所有提供的任务后完成,并将结果合并到数组中。

var task1 =  GetData(5000);
var task2 =  GetData(2000);
var task3 =  GetData(500);
await Task.WhenAll(task1, task2, task3);
var result1 = task1.Result;
var result2 = task2.Result;
var result3 = task3.Result;

您可以一次全部触发它们,然后使用 Task.WhenAll 等待它们完成。

所以你的代码将是这样的:

//Notice that we don't use await here.
var task1 = GetData(5000);
var task2 = GetData(2000);
var task3 = GetData(500);
Task ResultTask = await Task.WhenAll(new List<Task<dataDTO>> { task1 ,task2, task3 });
if (ResultTask.Status == TaskStatus.RanToCompletion)
Console.WriteLine("All tasks completed successfully!");
else if (ResultTask.Status == TaskStatus.Faulted)
Console.WriteLine("Operation failed!");  

此外,您可以通过ResultTask.Result访问他们的结果:

foreach (var result in ResultTask.Result) 
{
//Do stuff
}

相关内容

  • 没有找到相关文章

最新更新