正确的异步方法
本文关键字:异步方法 | 更新日期: 2023-09-27 17:51:16
是以下正确的方法来创建一个异步方法,其中方法中的代码必须做多个异步调用,需要等待。计划是启动多个这样的方法,然后等待它们全部完成后再继续执行代码。
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;
});
}
代码:
- 启动线程池线程(
Task.Run
), - 将启动异步I/O操作(
GetAsync
),然后返回到线程池。 - 当I/O完成后(
await
),将启动另一个线程池线程(ConfigureAwait(false)
), - 将启动另一个异步I/O操作来读取HTTP响应(
GetAsStringAsync
)的内容,并返回到线程池。 - 当I/O完成(
await
)时,将启动另一个线程池线程将内容返回给调用方法。
你可以跳过第一步。完全。它所做的只是将对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);