Метод беше извикан в неочакван момент

Опитвам се да повторя всички файлове в директория с помощта на GetFilesAsync, но всеки път, когато извикам метода GetResults, той хвърля изключение, което казва

System.InvalidOperationException: Метод е извикан в неочакван момент

Кодът е прост

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

Нов съм в Win 8 dev, така че може да пропускам нещо очевидно.

Редактиране (решено) Изпълнявам конзолното си приложение, но сега, когато програмата работи async, методът 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)


Трябва да изчакате async методът да завърши. Така че можете да използвате новото чакане като една опция:

var files = await myStorageFolder.GetFilesAsync();

Може да поискате да проверите документацията за работа с асинхронни методи тук .

person AndrewS    schedule 27.10.2012

Ако не искате да използвате asynckeyword (в моя случай кодът беше вътре в свойство, така че 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