18

próbuję iteracyjne wszystkie pliki w katalogu z użyciem GetFilesAsync, ale za każdym razem wywołać metodę getresults, zgłasza wyjątek, który mówiMetoda nazwano w nieoczekiwanym momencie

System.InvalidOperationException: metoda nazwano na nieoczekiwane czasie

Kod jest po prostu

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

Jestem nowy na Win 8 dev więc może brakować czegoś oczywistego.

Edit (rozwiązany) Biegnę mojej aplikacji konsoli, ale teraz, że program działa asynchronicznie, metoda files.GetResult() już nie istnieje.

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(); 
} 

Odpowiedz

10

Musisz zaczekać na ukończenie metody asynchronicznej. Więc można korzystać z nowej czekają jako jednej opcji:

var files = await myStorageFolder.GetFilesAsync(); 

może chcesz sprawdzić dokumentację w sprawach związanych z metod asynchronicznych here.

1

należy await się var files = myStorageFolder.GetFilesAsync(); jako operacja może nadal działać, kiedy dojdziesz do następnej instrukcji 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 
29

Jeśli nie chcesz używać słowa kluczowego async (w moim przypadku, kod jest w środku własność, więc async nie było opcji), można użyć zamiast TaskAwaiter, przez łączenia tych dwóch metod:

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

To nie rzuci InvalidOperationException ani nie powoduje zakleszczenia.

+0

Czy potrzebuję żadnych instrukcji 'Using' do użycia metody' GetAwaiter'? – user1

+1

@ user1 Nie pamiętam, to jest sprzed 2 lat. Ale przeglądając dokumenty, jest to metoda rozszerzenia, której potrzebujesz: ['WindowsRuntimeSystemExtensions.GetAwaiter'] (https://msdn.microsoft.com/en-us/library/hh582011 (v = vs.110) .aspx). Jest on zdefiniowany w przestrzeni nazw 'System', więc prawdopodobnie masz ją już w zakresie – dcastro

+3

Zauważyłem, że' GetAwaiter() 'było na' Zadanie' i próbowałem użyć go na 'IAwaitableOperation', więc musiałem zadzwonić' AsTask', a następnie 'Wyniki', cholernie' UWP'. W każdym razie dzięki! – user1

Powiązane problemy