2014-10-20 2 views
0

У меня есть следующий код:Асинхронный Метод скачет ждут

public async Task<string> GetData(Uri source) 
{ 
    if (client.IsBusy == true) 
     client.CancelAsync(); 

    Task<string> tskResult = client.DownloadStringTaskAsync (source); 

    string strResult = await tskResult; 
    return strResult; 
} 

Когда я шагаю с помощью этого метода, начиная с Task<string>... отладчик перепрыгивает через return strResult; И значение strResult равно нулю.

Почему это происходит? Спасибо.

PS: Я называю этот метод, как это:

StringBuilder strBuild = новый StringBuilder();

foreach (var image in imageApiUrlLst) 
{ 
    string imageModelPull = await callMgr.GetData(new Uri(image)); ///WHY GETS STUCK! 
    strBuild.AppendLine(imageModelPull); 
    } 
+0

Прекрасно работает для меня, когда я копирую код. (предполагается, что клиент = WebClient) –

+0

Это по дизайну .. помните, вы не возвращаете 'strResult' i.e.' string 'из вашего метода. Тип возвращаемого значения для этого метода: «Задача ' .. Узнайте больше о том, как работает async, и что он предназначен для ... В противном случае это будет слишком широкая тема для ответа в ответ или уже должна быть покрыта SO , Я бы держал пари. –

+0

Я тоже пытался вернуть rskResult, проблема в том, что в соответствии с отладчиком (я использую Xamarin) этот метод вызывается, но ничего не выйдет. Отладчик не выпрыгивает из этого метода. – RealityDysfunction

ответ

1

async метод возвращает как только как await заявление будет достигнуто, если вещь ожидало еще не закончил. Как только он завершается, метод продолжает выполнение после этого await. Попробуйте положить точку прерывания в оператор return, и он должен получить удар дважды.

0

aysnc отмечает, что метод является асинхронным. Ожидание, когда выполнение продолжится с КОГДА результат возвращается от вызова.

При выполнении запроса на выполнение tskResult не удается выполнить следующие шаги, так как выполнение должно ждать (возможно, много тактов), поэтому он пропустит этот метод после первого указания маркера относительно того, куда он должен вернуться.

Когда DownloadStringTaskAsync завершит работу, он вернется к этому методу и ТОЛЬКО затем назначит результат. В реальном времени это может быть миллионы циклов ЦП после того, как был инициирован вызов., Перешагивая через отладчик по одной строке за раз, когда вы увидите переход, а затем и обратно.

Положите вас на точку останова при возврате strResult и не проходите. просто подождите, пока вызов вернется после того, как клиент вернется. Загрузите LoadStringTaskAsync.

Также, если во время выполнения этого метода существует исключение, то это будет «потреблять» методом, поэтому, если код не прерывается при возврате, а затем оберните весь блок в try catch, а также поместите точку останова внутри улова - так что вы можете видеть, какое исключение вы получаете.

Смежные вопросы