Асинхронные методы не работают на Windows Phone

У меня есть следующий фрагмент кода (WPF, Windows Phone 8.1):

HttpClient client = new HttpClient();
var httpResult = client.GetAsync(feed.Url, ct);
string feedData = await httpResult.Result.Content.ReadAsStringAsync();

var sf = new SyndicationFeed();
sf.Load(feedData);

Я пытаюсь отладить этот код. Однако после строки:

string feedData = await httpResult.Result.Content.ReadAsStringAsync();

отладчик, кажется, позволяет приложению работать самостоятельно и никогда не переходит к следующей строке. Это почему? Я делаю что-то неправильно?


person Spook    schedule 09.01.2015    source источник
comment
Он асинхронный, он дойдет до него, когда будет информация.   -  person Christo S. Christov    schedule 09.01.2015
comment
@CodingChief Я не могу представить, чтобы загрузка короткого XML-файла через Wi-Fi заняла более 1 минуты.   -  person Spook    schedule 10.01.2015
comment
как сказал Джон, вы, вероятно, зашли в тупик, поэтому это заняло так много времени.   -  person Christo S. Christov    schedule 10.01.2015
comment
Обратите внимание, что Windows Phone — это не то же самое, что WPF; рассмотрите возможность удаления тега и содержимого.   -  person Peter Torr - MSFT    schedule 12.01.2015


Ответы (1)


В зависимости от того, вызываете ли вы результат или ожидаете выполнения задачи где-то вверх по течению, это может привести к тупиковой ситуации, как указано в запись в блоге.

Смягчите это, ожидая client.GetAsync() и используйте ConfigureAwait, где это возможно, чтобы свести к минимуму вероятность взаимоблокировок:

HttpClient client = new HttpClient();
var httpResult = await client.GetAsync(feed.Url, ct).ConfigureAwait(false);
string feedData = await httpResult.Content.ReadAsStringAsync().ConfigureAwait(false);

var sf = new SyndicationFeed();
sf.Load(feedData)
person John Koerner    schedule 09.01.2015
comment
Кроме того, измените все восходящие вызовы Wait или Result, чтобы использовать вместо них await. - person Stephen Cleary; 10.01.2015
comment
@StephenCleary На самом деле это была основная проблема - я ждал метода, который я разместил выше, через Wait. Но это меня немного беспокоит - есть ли (рабочий) способ принудительно выполнять некоторые асинхронные задачи синхронно? - person Spook; 10.01.2015
comment
Работа выполняется асинхронно. ConfigureAwait(false) указывает, что когда работа выполнена, вам все равно, какой поток используется для возобновления остальной части работы. - person John Koerner; 10.01.2015
comment
@Spook: Нет. - person Stephen Cleary; 11.01.2015
comment
@StephenCleary Хорошо, я неправильно выразился. Под принудительным запуском я имел в виду ожидание завершения задачи, прежде чем продолжить ее выполнение. Это должно быть сделано с помощью Wait, но это приводит к взаимоблокировкам. Так есть ли другой, правильный способ сделать это? - person Spook; 11.01.2015
comment
@Spook: Да, просто используйте await task; вместо task.Wait();. - person Stephen Cleary; 11.01.2015
comment
@StephenCleary А если я не хочу, чтобы метод вызова был асинхронным? - person Spook; 13.01.2015
comment
@Spook: он выполняет асинхронную работу, поэтому должно быть async. async действительно естественным образом растет в кодовой базе, и это следует учитывать. - person Stephen Cleary; 13.01.2015