我目前正在使用 WPF 4.5 和 Visual Studio 11 开发人员预览版。我正在使用 async-await 东西在应用程序事件处理程序中异步执行 http requets。问题是第一次调用 await-able 方法会挂起应用程序线程,直到它完成。所有后续调用都可以,即在执行它们时应用程序仍然可用。
这是我的代码(仅有意义的摘录):
XAML
<toolkit:AutoCompleteBox FilterMode="None"
Margin="5,0,5,0"
x:Name="textArrival"
Populating="textArrival_Populating"
SelectionChanged="textArrival_SelectionChanged"/>
C#代码隐藏:
private async void textArrival_Populating(object sender, PopulatingEventArgs e)
{
e.Cancel = true;
textDeparture.ItemsSource = await model.ProcessStationRequest(textArrival.Text);
textArrival.PopulateComplete();
}
来自前一段代码的可等待调用源:
public async Task<object[]> ProcessStationRequest(string request)
{
// omitted: preparing the request into MemoryStream outputStream
// ...
HttpResponseMessage response = await httpClient.PostAsync(hostName, outputStream);
// omitted: parsing the XML response to an object responseContainer
// and returning its member Items, which are of type object[]
//...
return responseContainer.Items;
}
当我在 ...await httpClient.PostAsync... 行之后调试和设置断点时,我发现在处理请求期间(大约 2 秒),确实是这个调用挂起了我的应用程序。但是,如果我将断点放在等待调用的行上,它会在自动完成文本框的填充开始后立即发生。至少在我的代码中,两者之间没有任何内容,这就是为什么我假设它对 httpClient 的等待调用会使我的应用程序挂起。
你能指出这段代码中导致这种奇怪行为的一些问题吗?