3 つのリモート API サーバーに何かが存在するかどうかを確認する必要がある ASP.NET MVC アプリケーションがあります。アプリケーションは 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 アクションが返されます。
1 つの API が true を返すとすぐに、他のタスクが完了するのを待つのではなく、Action ですぐに true を返したいと考えています。
C# Task クラスには .WaitAll と .WaitAny がありますが、これらも機能しません。他の HttpClient リクエストをキャンセルする必要があるため、CancellationToken を使用する必要があると思いますが、この構造で使用する方法がわかりません。
乾杯。