2014-10-03 3 views
0

Я кодирую приложение Xamarin и пытаюсь загрузить изображение асинхронно, а затем сохраните это изображение в файле.Загрузка изображения с функцией асинхронного вывода без ошибки

Вот мой код:

public async void DownloadAsyncFile(string webAddress, string fileName) 
{ 
    var webClient = new WebClient(); 
    var uri = new Uri (webAddress); 
    byte[] bytes = null; 
    try 
    { 
     bytes = await webClient.DownloadDataTaskAsync(uri); 
     CreateFolderFromFileName (fileName); 
     File.WriteAllBytes(fileName, bytes); 
    } 
    catch(TaskCanceledException){ 
     System.Console.WriteLine ("Task Canceled!"); 
     return; 
    } 
    catch(Exception e){ 
     System.Console.WriteLine (e.ToString()); 
     return; 
    } 
} 

public void CreateFolderFromFileName(string fileName) 
{ 
    string folderName = GetFolderPathFromFileName (fileName); 
    System.IO.Directory.CreateDirectory(folderName); 
} 

код выполняется, однако, функция DownloadAsyncFile завершает работу до последней строки кода в функции в этой строке кода:

bytes = await webClient.DownloadDataTaskAsync(uri); 

Нет когда это произойдет.

Могу ли я, пожалуйста, помочь с вышеуказанным кодом?

ответ

3

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

Ваш метод должен возвращать Task вместо void. Таким образом, вы можете проверить, когда функция завершится, а исключения, которые вы выбрали внутри DownloadAsyncFile, могут распространяться вне функции. См. Best Practices in Asynchronous Programming для получения дополнительных рекомендаций по лучшим практикам. Void return async методы в значительной степени предназначены только для обработчиков событий.

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