我有一个 ASP.NET MVC 应用程序,它需要检查 3 个远程 API 服务器上是否存在某些东西。应用程序将一个 ID 传递给每个 API,它返回 true 或 false。代码看起来像这样。
public class PingController
{
public async Task<bool> IsFound(int id)
{
var servers = new ['a.com', b.com', 'c.com'];
var result = await foundAtServers(id, servers);
return result;
}
private async Task<bool> foundAtServers(int id, string[] servers)
{
var tasks = from server in servers
select checkServer(id, server);
return await.Task.WhenAll(tasks.ToArray());
}
private async Task<bool> checkServer(id, server)
{
var request = new HttpRequestMessage(HttpMethod.Get, server+"/api/exists"+id);
var client = new HttpClient();
var task = await client.SendAsync(request);
var response = await task.Content.ReadAsStringAsync();
return bool.Parse(response);
}
}
此代码当前异步检查所有 3 个 API,但将等到所有 HttpClient 调用完成后,MVC Action 才能返回。
一旦一个 API 返回 true,我想立即在 Action 上返回 true,而不是等待其他任务完成。
C# Task 类有 .WaitAll 和 .WaitAny,但它们也不起作用。由于我需要取消另一个 HttpClient 请求,我认为我需要使用 CancellationToken 但我不知道如何将它与这个结构一起使用。
干杯。