【发布时间】:2012-08-27 11:44:00
【问题描述】:
我正在构建一个 Metro 应用程序。
在 MainPage.xaml.cs 中,我将 Album 实例化如下:
Album album = new Album(2012); //With the album ID as its parameter.
ListView1.ItemsSource = album.Songs;
在Album.cs中,构造函数如下:
public Album(int ID)
{
this.ID = ID;
Initialize(); //Serves as a wrapper because I have to call httpClient.GetStreamAsync() and "async" doesn't work for the constructor.
}
最后是 Initialize 方法:
private async void Initialize()
{
//...some code...
HttpClient cli = new HttpClient();
Stream SourceStream = await HttpClient.GetStreamAsync("http://contoso.com");
//...some code...
this.Songs = Parse(SourceStream);
}
问题是当它运行到 GetStreamAsync 时,它会直接转到 ListView1.ItemsSource = album.Songs,并且专辑.Songs 为空。
这个问题有什么快速的解决方法吗?
【问题讨论】:
-
await不能这样工作。它开始一个异步操作。您需要await获取代码中的结果。 -
@Vlad:不,
await本身不会启动异步操作。await只需将控制权交还并安排继续(当然,如果需要)。 -
@Jon:你说得对,它把控制权交还给我,我应该提到它,但是“安排一个延续”实际上与“启动一个异步操作”不一样吗?
-
@Vlad:不,它会安排它。在您等待的任何操作完成之前,该操作不会开始。
-
@Vlad:不,因为
GetStreamAsync是启动操作的原因。这可能在await表达式之前很长一段时间内发生——在基于异步任务的模式中,任务是“热的”,与 F# 不同。await表达式 only 在必要时安排延续 - 它不会启动操作。
标签: c# asynchronous .net-4.5