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

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

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

Код просто

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

Я новичок в разработке Win 8, поэтому могу упустить что-то очевидное.

Изменить (решено) Я запускаю свое консольное приложение, но теперь, когда программа работает асинхронно, метод 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();
}

person XSL    schedule 27.10.2012    source источник


Ответы (4)


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

var files = await myStorageFolder.GetFilesAsync();

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

person AndrewS    schedule 27.10.2012

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

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

Это не вызовет InvalidOperationException и не вызовет взаимоблокировки.

person dcastro    schedule 21.09.2013
comment
Нужны ли мне какие-либо операторы Using для использования метода GetAwaiter? - person user1; 24.11.2016
comment
@ user1 Я не могу вспомнить, это было 2 года назад. Но, просматривая документы, это метод расширения, который вам нужен: WindowsRuntimeSystemExtensions.GetAwaiter. Он определен в пространстве имен System, поэтому вы, вероятно, уже имеете его в области видимости. - person dcastro; 24.11.2016
comment
Я заметил, что GetAwaiter() был на Task, и я пытался использовать его на IAwaitableOperation, так что мне пришлось звонить AsTask, затем Results, черт побери UWP. Спасибо хоть! - person user1; 24.11.2016
comment
Это также решает проблему в операторе if. Я получал ошибку, когда только запускал приложение, но не в том случае, если я устанавливал точку останова непосредственно перед оператором if и использовал Step Into для выполнения оператора if. if(ApplicationData.Current.LocalFolder.TryGetItemAsync("savedFavorites.xml").GetAwaiter().GetResult() == null) - person Keven M; 14.03.2019

вам следует 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
person Mayank    schedule 27.10.2012

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

var file = StorageFile.GetFileFromPathAsync(protocolArgs.Uri.LocalPath).AsTask().Result;
person Murilo Maciel Curti    schedule 25.10.2020