正确的方法来制作异步方法

时间:2015-05-30 21:05:37

标签: c# asynchronous

以下是制作异步方法的正确方法,其中方法中的代码必须执行需要等待的多个异步调用。 计划是从这个方法的多个开始,并等待所有这些方法在代码继续之前完成。

    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;
        });
    }

1 个答案:

答案 0 :(得分:8)

您的代码:

  1. 启动线程池线程(Task.Run),
  2. 将启动异步I / O操作(GetAsync),然后返回到线程池。
  3. 当I / O完成(await)时,将启动另一个线程池线程(ConfigureAwait(false)),
  4. 将启动另一个异步I / O操作以读取HTTP响应的内容(GetAsStringAsync),然后返回到线程池。
  5. 当I / O完成(await)时,将启动另一个线程池线程将内容返回给调用方法。
  6. 您可以完全跳过第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);