Первый вызов ожидающей возможности асинхронной функции является синхронным по неизвестной причине - PullRequest
0 голосов
/ 25 октября 2011

В настоящее время я играю с WPF 4.5 и Visual Studio 11 Developer Preview. Я использую async-await для асинхронного выполнения http-запросов в обработчике событий приложения. Проблема в том, что при первом вызове метода await-способны поток приложения зависает до его завершения. Все последующие вызовы в порядке, т. Е. Пока они выполняются, приложение остается работоспособным.

Вот мой код (только значимые выдержки):

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 заставляет мое приложение зависать.

Можете ли вы указать какую-то проблему в этом коде, которая вызывает такое странное поведение?

1 Ответ

0 голосов
/ 25 октября 2011

Возможно, вы столкнулись с известной проблемой с HttpWebRequest.«Асинхронные» методы для этого объекта на самом деле не являются (полностью) асинхронными.: (

На данный момент, я бы рекомендовал обернуть PostAsync в Task.Run.

Я поднял эту проблему до WCF (HttpClient)команда и асинхронная команда также изучают ее . Реального ответа пока нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...