Метод был вызван в неожиданное время

Я пытаюсь перебрать все файлы в каталоге, используя GetFilesAsync, но каждый раз, когда я вызываю метод GetResults, он выдает исключение, которое говорит

System.InvalidOperationException: метод был вызван в неожиданное время

Код просто

var files = myStorageFolder.GetFilesAsync(); //runs fine
var results = files.GetResults(); //throws the exception

Я новичок в Win 8 dev, поэтому я могу упустить что-то очевидное.

Изменить (решено) Я запускаю консольное приложение, но теперь, когда программа запускается асинхронно, files.GetResult() метод больше не существует.

static void Main(string[] args)
{
   var files = GetFiles(myStorageFolder);
   var results = files.GetAwaiter().GetResults();//Need to add GetAwaiter()
}

static async Task GetFiles(StorageFolder sf)
{
   await sf.GetFilesAsync();
}

3 ответа

Решение

Вам нужно дождаться завершения асинхронного метода. Таким образом, вы можете использовать новый await как один из вариантов:

var files = await myStorageFolder.GetFilesAsync();

Вы можете проверить документацию по работе с асинхронными методами здесь.

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

var folder = Package.Current.InstalledLocation.GetFolderAsync("folderName").GetAwaiter().GetResult();

Это не бросит InvalidOperationException ни вызвать тупик.

Вам следует await var files = myStorageFolder.GetFilesAsync(); поскольку операция может все еще выполняться, когда вы переходите к следующей инструкции var results = files.GetResults(); //throws the exception

var files = await myStorageFolder.GetFilesAsync(); //runs fine
var results = files.GetResults(); //this will run when call above returns

Если вы используете вариант Task, например Windows.Foundation.IAsyncOperation, код может быть таким:

var file = StorageFile.GetFileFromPathAsync(protocolArgs.Uri.LocalPath).AsTask().Result;
Другие вопросы по тегам