18

Ich versuche, alle Dateien in einem Verzeichnis iterieren GetFilesAsync verwenden, aber jedes Mal, wenn ich die GetResults Methode aufrufen, wirft es eine Ausnahme, die sagtVerfahren wurde zu einem unerwarteten Zeitpunkt genannt

System.InvalidOperationException: Verfahren bei einer unerwarteten Zeit

Der Code

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

ich bin neu zu gewinnen 8 dev so dass ich einfach genannt wurde könnte etwas offensichtlich fehlen.

Edit (gelöst) ich meine Konsole-Anwendung ausgeführt wird, aber jetzt, dass das Programm async läuft, besteht die files.GetResult() Methode nicht mehr.

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

Antwort

10

Sie müssen warten, bis die asynchrone Methode abgeschlossen ist. So könnte man die neue await als eine Option:

var files = await myStorageFolder.GetFilesAsync(); 

Vielleicht mögen Sie die Dokumentation über den Umgang mit asynchronen Methoden here überprüfen.

1

sollten Sie die var files = myStorageFolder.GetFilesAsync();await als der Betrieb noch ausgeführt werden, wenn Sie zur nächsten Anweisung bekommen 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

Wenn Sie möchten, dass das async Schlüsselwort nicht verwenden (in meinem Fall war der Code innerhalb eine Eigenschaft, so war async keine Option), können Sie stattdessen eine TaskAwaiter verwenden können, durch diese beiden Methoden Verkettungs:

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

Dies wird nicht einewerfennoch einen Deadlock verursachen.

+0

Benötige ich 'Using'-Anweisungen, um die' GetAwaiter'-Methode zu verwenden? – user1

+1

@ user1 Ich kann mich nicht erinnern, das ist vor 2 Jahren. Wenn Sie jedoch die Dokumente durchgehen, ist dies die Erweiterungsmethode, die Sie benötigen: ['WindowsRuntimeSystemExtensions.GetAwaiter'] (https://msdn.microsoft.com/en-us/library/hh582011 (v = vs.110) .aspx). Es ist im 'System'-Namespace definiert, also hast du es wahrscheinlich bereits im Bereich – dcastro

+3

Ich bemerkte, dass' GetAwaiter() 'auf einer' Task' war und ich versuchte, es auf einer 'IAwaitableOperation' zu verwenden, also musste ich' aufrufen AsTask' dann 'Results', verdammt' UWP'. Trotzdem danke! – user1

Verwandte Themen