現在、WPF4.5とVisualStudio 11DeveloperPreviewで遊んでいます。私はasync-awaitのものを使用して、アプリケーションイベントハンドラーで非同期にhttprequetsを実行しています。問題は、待機可能なメソッドを最初に呼び出すと、終了するまでアプリケーションスレッドがハングすることです。後続のすべての呼び出しは問題ありません。つまり、実行中、アプリケーションは引き続き使用できます。
これが私のコードです(意味のある抜粋のみ):
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;
}
行の直後にデバッグしてブレークポイントを設定しているとき...httpClient.PostAsync...を待つと、要求が処理されている間(約2秒)にアプリケーションがハングしているのは、実際にはこの呼び出しであることがわかります。しかし、待機可能な呼び出しのある行にブレークポイントを配置すると、オートコンプリートテキストボックスの入力が開始された直後に発生します。少なくとも私のコードでは、間に何もありません。そのため、httpClientへの待機可能な呼び出しによってアプリがハングすると想定しています。
このような奇妙な振る舞いを引き起こすこのコードの問題を指摘できますか?