Task.Run on方法返回T VS方法返回Task <T>

GIV*_*KEN 0 .net c# asynchronous async-await

场景1 - 对于字符串列表中的每个网站(_websites),调用方法将GetWebContent包装到任务中,等待所有任务完成并返回结果.

    private async Task<string[]> AsyncGetUrlStringFromWebsites()
    {
        List<Task<string>> tasks = new List<Task<string>>();

        foreach (var website in _websites)
        {
            tasks.Add(Task.Run(() => GetWebsiteContent(website)));
        }

        var results = await Task.WhenAll(tasks);

        return results;
    }

    private string GetWebContent(string url)
    {
        var client = new HttpClient();

        var content = client.GetStringAsync(url);

        return content.Result;
    }
Run Code Online (Sandbox Code Playgroud)

场景2 - 对于字符串列表中的每个网站(_websites),调用方法调用GetWebContent(返回Task <string>),等待所有任务完成并返回结果.

    private async Task<string[]> AsyncGetUrlStringFromWebsites()
    {
        List<Task<string>> tasks = new List<Task<string>>();

        foreach (var website in _websites)
        {
            tasks.Add(GetWebContent(website));
        }

        var results = await Task.WhenAll(tasks);

        return results;
    }

    private async Task<string> GetWebContent(string url)
    {
        var client = new HttpClient();

        var content = await client.GetStringAsync(url);

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

问题 - 哪种方法是正确的方法,为什么?每种方法如何影响实现异步处理?

Ren*_*ogt 6

Task.Run()您占用线程池中的线程并告诉它等待直到收到Web内容.
你为什么想这么做?你收到一个人站在你邮箱旁边告诉你什么时候来信?

GetStringAsync已经是异步的.当内容通过网络进入时,cpu与此过程无关(使用此过程).

所以第二种方法是正确的,不需要在这里使用线程池中的额外线程.

总是很有趣:Stephen Cleary的"没有线程"