在查看了这个博客阅读器教程后,我注意到在单个方法中进行了 14 个异步调用。 这些是同时运行还是并行运行? 如果不是,那么发生错误时会发生什么?其余部分是串行运行,还是整个方法停止?
示例代码:
public async Task GetFeedsAsync()
{
Task<FeedData> feed1 =
GetFeedAsync("http://windowsteamblog.com/windows/b/developers/atom.aspx");
Task<FeedData> feed2 =
GetFeedAsync("http://windowsteamblog.com/windows/b/windowsexperience/atom.aspx");
Task<FeedData> feed3 =
GetFeedAsync("http://windowsteamblog.com/windows/b/extremewindows/atom.aspx");
Task<FeedData> feed4 =
GetFeedAsync("http://windowsteamblog.com/windows/b/business/atom.aspx");
Task<FeedData> feed5 =
GetFeedAsync("http://windowsteamblog.com/windows/b/bloggingwindows/atom.aspx");
Task<FeedData> feed6 =
GetFeedAsync("http://windowsteamblog.com/windows/b/windowssecurity/atom.aspx");
Task<FeedData> feed7 =
GetFeedAsync("http://windowsteamblog.com/windows/b/springboard/atom.aspx");
Task<FeedData> feed8 =
GetFeedAsync("http://windowsteamblog.com/windows/b/windowshomeserver/atom.aspx");
// There is no Atom feed for this blog, so we use the RSS feed.
Task<FeedData> feed9 =
GetFeedAsync("http://windowsteamblog.com/windows_live/b/windowslive/rss.aspx");
Task<FeedData> feed10 =
GetFeedAsync("http://windowsteamblog.com/windows_live/b/developer/atom.aspx");
Task<FeedData> feed11 =
GetFeedAsync("http://windowsteamblog.com/ie/b/ie/atom.aspx");
Task<FeedData> feed12 =
GetFeedAsync("http://windowsteamblog.com/windows_phone/b/wpdev/atom.aspx");
Task<FeedData> feed13 =
GetFeedAsync("http://windowsteamblog.com/windows_phone/b/wmdev/atom.aspx");
Task<FeedData> feed14 =
GetFeedAsync("http://windowsteamblog.com/windows_phone/b/windowsphone/atom.aspx");
this.Feeds.Add(await feed1);
this.Feeds.Add(await feed2);
this.Feeds.Add(await feed3);
this.Feeds.Add(await feed4);
this.Feeds.Add(await feed5);
this.Feeds.Add(await feed6);
this.Feeds.Add(await feed7);
this.Feeds.Add(await feed8);
this.Feeds.Add(await feed9);
this.Feeds.Add(await feed10);
this.Feeds.Add(await feed11);
this.Feeds.Add(await feed12);
this.Feeds.Add(await feed13);
this.Feeds.Add(await feed14);
}
.NET 4.5 的 HttpClient 异步 API(在 WinRT 中使用)会在调用 HttpClient.GetAsync 方法(或其 put、post delete 等)后立即自动启动 Web 请求任务。
这些任务是承诺。
因此,在上面的例子中,所有的任务都是并行启动的,然后线程将由第一个等待变得可用,直到第一个请求返回,然后直到第二个请求返回,依此类推......
如果任务在等待时已完成,则等待指令将同步运行。
如果在执行请求期间发生错误,则在等待任务时将引发异常。因此,如果您不等待任务,则任何异常都将丢失。