2013-08-08 6 views
4

У меня возникли проблемы с загрузкой файлов через приложение для работы с окнами. Вот мой метод для скачивания:Скачивание файла в приложении для магазина Windows

private static async void DownloadImage() 
    { 
     HttpClient client = new HttpClient(); 

     HttpResponseMessage message = await client.GetAsync("http://coolvibe.com/wp-content/uploads/2010/05/scifiwallpaper1.jpg"); 

     StorageFolder myfolder = Windows.Storage.ApplicationData.Current.LocalFolder; 
     StorageFile sampleFile = myfolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting).GetResults();// this line throws an exception 
     byte[] file = await message.Content.ReadAsByteArrayAsync(); 

     await FileIO.WriteBytesAsync(sampleFile, file); 
     var files = await myfolder.GetFilesAsync(); 

    } 

На отмеченной линии я получаю это исключение:

An exception of type 'System.InvalidOperationException' occurred in ListStalkerWin8.exe but was not handled in user code 

WinRT information: A method was called at an unexpected time. 

Additional information: A method was called at an unexpected time. 

Что может быть причиной этого?

ответ

2

Вы звоните GetResults на IAsyncOperation, который еще не завершен , и поэтому не находится в состоянии, когда вы можете получить доступ к результатам (потому что они еще не существуют).

На самом деле, вам не нужен вызов GetResults вообще, вам просто нужно:

StorageFile sampleFile = await myfolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting); 
+0

thnku очень много Марио Стойлов и Крис У. я тонул с этой проблемой – FebinDonz

0

Изменение

StorageFile sampleFile = myfolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting).GetResults();// 

в

StorageFile sampleFile = await myfolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting); 

, кажется, решить эту проблему, хотя я не знаю, почему

+0

Это устраняет проблему, так как функция CreateFileAsync() является асинхронным. В Windows Store C# API (я не знаю о WinJS) любая асинхронная функция будет иметь постфикс «Async». Это означает, что у вас есть возможность «запускать» создание файла, делать другие вещи, а затем извлекать StorageFile позже, когда он будет создан. Добавляя ключевое слово «ожидание», вы делаете функцию синхронной; это как сказать «начать создание файла и не возвращаться, пока это не будет сделано». Я знаю, что это долго, но проверка http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1 – YasharBahman

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