【发布时间】:2012-11-12 06:09:43
【问题描述】:
我是 c# 5 的异步功能的新手。 我试图了解这两种实现之间的区别:
实施 1:
private void Start()
{
foreach(var url in urls)
{
ParseHtml(url);
}
}
private async void ParseHtml(string url)
{
var query = BuildQuery(url); //BuildQuery is some helper method
var html = await DownloadHtml(query);
//...
MyType parsedItem = ParseHtml(html);
SaveTypeToDB(parsedItem);
}
private async Task<string> DownloadHtml(string query)
{
using (var client = new HttpClient())
try
{
var response = await client.GetAsync(query);
return (await response.Content.ReadAsAsync<string>());
}
catch (Exception ex)
{
Logger.Error(msg, ex);
return null;
}
}
实施 2:
private void DoLoop()
{
foreach(var url in urls)
{
Start(url);
}
}
private async void Start(url)
{
await Task.Run( () => ParseHtml(url)) ;
}
private void ParseHtml(string url)
{
var query = BuildQuery(url); //BuildQuery is some helper method
var html = DownloadHtml(query);
//...
MyType parsedItem = ParseHtml(html);
SaveTypeToDB(parsedItem);
}
private string DownloadHtml(string query)
{
using (var client = new WebClient())
{
try
{
return client.DownloadString(query);
}
catch (Exception ex)
{
Logger.Error(msg, ex);
return null;
}
}
}
我宁愿使用第二种实现方式,因为它在我的代码中的方法上需要更少的“异步”签名。我试图了解使用 HttpClient 类与使用新任务并等待它的好处是什么?
这两种实现有什么区别吗?
【问题讨论】:
-
'async' signatures- 不关心他们。 “异步”只是与旧代码保持兼容的“标记”。在 5.0 之前的版本中,您可以拥有名称为“await”的变量/函数。但由于旧方法没有“async”关键字,代码仍将使用 C# 5.0 编译(无需更改)。
标签: c# asynchronous task-parallel-library async-await c#-5.0