2011-10-25 35 views
0

我目前正在玩弄WPF 4.5和Visual Studio 11开发者预览版。我正在使用异步等待东西在应用程序事件处理程序中异步执行http请求。问题是,首先调用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使我的应用程序挂起。

你能指出一些问题在这个代码中导致这样一个奇怪的行为?

+0

VS2011具有async-因此我不认为你发布的异步代码挂在你的应用程序上;调试器不会中断,直到方法被恢复。 –

+0

@StephenCleary,谢谢你的信息,我会记住的。尽管如此,我在我的应用程序中遇到了挂起问题,当我在等待可以调用httpClient的线路上设置断点时,它会毫无延迟地被击中,但是,当我设置在等待电话之后立刻断点,我看到延迟,并且在此期间申请被吊销。好吧,我明白第二个断点*单独*命中并不能证实我对真正的挂起原因的猜测,而是在该电话之前不挂断断点,我怀疑它确实存在。我会编辑这个问题,使其更清晰。 – Haspemulator

回答