C# 创建异步方法的正确方法

C# 创建异步方法的正确方法,c#,asynchronous,C#,Asynchronous,下面是生成异步方法的正确方法,其中方法中的代码必须执行多个需要等待的异步调用。 计划是启动多个此方法,并在代码继续之前等待所有方法完成 public static Task<string> Get(string url) { return Task.Run(async () => { var client = getBaseHttpClient(); var result = awa

下面是生成异步方法的正确方法,其中方法中的代码必须执行多个需要等待的异步调用。 计划是启动多个此方法,并在代码继续之前等待所有方法完成

    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;
        });
    }
公共静态任务获取(字符串url)
{
返回任务。运行(异步()=>
{
var client=getBaseHttpClient();
var result=await client.GetAsync(url).ConfigureAwait(false);
if(结果。IsSuccessStatusCode)
{
返回wait result.Content.ReadAsStringAsync();
}
返回null;
});
}
您的代码:

  • 启动线程池线程(
    Task.Run
  • 它将启动异步I/O操作(
    GetAsync
    ),然后返回线程池
  • 完成I/O后(
    await
    ),将启动另一个线程池线程(
    ConfigureAwait(false)
  • 它将启动另一个异步I/O操作来读取HTTP响应的内容(
    GetAsStringAsync
    ),并返回线程池
  • 当I/O完成(
    wait
    )时,将启动另一个线程池线程以将内容返回给调用方法
  • 你可以跳过第一步。总共它所做的只是将对
    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;
    }
    

    谢谢你的建议,很好的解释真的很有帮助。我很快就会接受答案,在我的第一篇帖子中,我还有一个问题要问你,你是否能帮我解决这个问题?@DoomStone我很高兴它能帮上忙。我不确定我是否理解你的第二个问题。。请发表一个单独的问题,更详细一点,我会看看我是否可以回答它那里。
    var tasks = urls.Select(Get);
    var responses = await Task.WhenAll(tasks);