2011-10-25 34 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

回答