4

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 を使用する必要があると思いますが、この構造で使用する方法がわかりません。

乾杯。

4

3 に答える 3