在C#中使代码异步

Jus*_*gin 1 c# asynchronous task httprequest

我有两种方法:第一种方法HTTP GET在一个地址上发送请求,第二种方法多次调用(因此,它向多个IP发送请求).这两种方法都是异步的,因此在请求远程处理时它们不会阻止代码执行.问题是,由于我的C#知识不足,我不知道如何同时发送所有请求,而不是一个接一个地发送(我的代码就是这样).那是我的代码:

public static async Task<string> SendRequest(Uri uri)
{
    using (var client = new HttpClient())
    {
        var resp = await client.GetStringAsync(uri).ConfigureAwait(false);
        return resp;
    }
}

public static async Task<string[]> SendToAllIps(string req)
{
    string[] resp = new string[_allIps.Length];

    for (int i = 0; i < _allIps.Length; i++)
    {
        resp[i] = await SendRequest(new Uri(_allIps[i] + req));
    }

    return resp;
}
Run Code Online (Sandbox Code Playgroud)

如何在SendToAllIps不等待以前的任务结果的情况下发送请求?SendToAllIps所有请求完成后,还必须返回一组响应.据我所知,这可以通过Task.WaitAll完成,但如何在这种特殊情况下使用它?

Lee*_*Lee 5

您可以Task.WhenAll用来等待任务集合:

public static async Task<string[]> SendToAllIps(string req)
{
    var tasks = _allIps.Select(ip => SendRequest(new Uri(ip + req)));
    return await Task.WhenAll(tasks);
}
Run Code Online (Sandbox Code Playgroud)

  • `await Task.WhenAll(tasks)`将返回`string []`,但是正确的代码将是`return await Task.WhenAll(tasks)`或者你可能会喜欢`var result = await Task.WhenAll(tasks)`; `return result` (2认同)