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)
问题 - 哪种方法是正确的方法,为什么?每种方法如何影响实现异步处理?
在Task.Run()您占用线程池中的线程并告诉它等待直到收到Web内容.
你为什么想这么做?你收到一个人站在你邮箱旁边告诉你什么时候来信?
GetStringAsync已经是异步的.当内容通过网络进入时,cpu与此过程无关(使用此过程).
所以第二种方法是正确的,不需要在这里使用线程池中的额外线程.
总是很有趣:Stephen Cleary的"没有线程"
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |