以下是制作异步方法的正确方法,其中方法中的代码必须执行需要等待的多个异步调用。 计划是从这个方法的多个开始,并等待所有这些方法在代码继续之前完成。
public static Task<string> Get(string url)
{
return Task.Run(async () =>
{
var client = getBaseHttpClient();
var result = await client.GetAsync(url).ConfigureAwait(false);
if (result.IsSuccessStatusCode)
{
return await result.Content.ReadAsStringAsync();
}
return null;
});
}
答案 0 :(得分:8)
您的代码:
Task.Run
),GetAsync
),然后返回到线程池。await
)时,将启动另一个线程池线程(ConfigureAwait(false)
),GetAsStringAsync
),然后返回到线程池。await
)时,将启动另一个线程池线程将内容返回给调用方法。您可以完全跳过第1步。它只是将对getBaseHttpClient
的调用推迟到线程池线程,我认为这不是密集的CPU限制工作 - 在这种情况下,它可以/应该同步完成。
public static async Task<string> Get(string url)
{
var client = getBaseHttpClient();
var result = await client.GetAsync(url).ConfigureAwait(false);
if (result.IsSuccessStatusCode)
{
return await result.Content.ReadAsStringAsync();
}
return null;
}
调用代码为:
var tasks = urls.Select(Get);
var responses = await Task.WhenAll(tasks);