0

現在、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への待機可能な呼び出しによってアプリがハングすると想定しています。

このような奇妙な振る舞いを引き起こすこのコードの問題を指摘できますか?

4

1 に答える 1

0

おそらく、で既知の問題が発生していHttpWebRequestます。このオブジェクトの「非同期」メソッドは、実際には(完全に)非同期ではありません。:(

今のところ、をでラップすることをお勧めPostAsyncTask.Runます。

私はこの問題をWCF(HttpClient)チームに持ち込み、非同期チームも調査しています。現在のところ、実際の応答はありません。

于 2011-10-25T15:50:10.753 に答える