我是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
}