Приложение зависает на устройстве при отладке асинхронного метода

Я следую руководству MSDN о скачивание файла. Поэтому я сделал очень простую загрузку:

private async void performDownload_Click(object sender, RoutedEventArgs e)
{
    CancellationTokenSource myCts = new CancellationTokenSource();
    ulong bytesReceived = await DownloadWebFile("myFile.jpg", myCts.Token);
    var forBreakpoint = 5; // set breakpoint here - isn't being hit on a device
    // some further code
}

public async Task<ulong> DownloadWebFile(string fileName, CancellationToken ct)
{
    Uri requestUri = new Uri("http://photojournal.jpl.nasa.gov/jpeg/PIA17555.jpg");
    StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

    BackgroundDownloader downloader = new BackgroundDownloader();
    downloader.Method = "GET";
    downloader.CostPolicy = BackgroundTransferCostPolicy.Always;

    DownloadOperation operation = downloader.CreateDownload(requestUri, file);
    operation.Priority = BackgroundTransferPriority.High;

    await operation.StartAsync().AsTask(ct);
    ulong bytes = operation.Progress.BytesReceived;
    return bytes;  // set breakpoint here - it is being hit
} // here App hangs (only on Device, on emulator works)

Странная ситуация, что на Эмуляторе все работает, а на Девайсе (Lumia 820) код зависает каждый раз при отладке. Если вы установите точку останова на последней строке DownloadWebFile - return bytes, она срабатывает, показывает правильное количество байтов, вы можете сделать шаг вперед, но только до скобки. При попытке продвинуться дальше приложение зависает (без точек останова тоже зависает). Файл, как я его вижу через IsolatedStorageExplorer, загружается корректно.

Похоже, что иногда программа зависает во время отладки при попытке выйти из асинхронного метода (спасибо, @yasen)


person Romasz    schedule 29.05.2014    source источник
comment
Вы пробовали оставить только точку останова на var forBreakpoint = 5;? В последнее время со мной такое часто случается — при отладке я не могу выйти за рамки некоторых асинхронных методов. В качестве обходного пути я просто ломаюсь сразу после них, как только я знаю, что они в порядке.   -  person yasen    schedule 29.05.2014
comment
@yasen Без шуток - ты прав. Я пытался выяснить, что не так с задержкой, и поставил точку останова внутри - и она полностью зависла. Странно, что на эмуляторе он ведет себя иначе. Я должен отредактировать вопрос, чтобы он не был неправильно истолкован - может быть, это кому-то поможет. Также, пожалуйста, добавьте ответ, поэтому он был решен. Спасибо.   -  person Romasz    schedule 29.05.2014


Ответы (1)


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

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

Хотя я не знаю, чем это вызвано. Я почти уверен, что когда-то это работало.

person yasen    schedule 29.05.2014