Wie warte ich auf eine IAsyncAction?

8

In Windows Store Apps ist C ++ (C # ist ähnlich), etwas wie

%Vor%

führt zu einer unbehandelten Ausnahme. Normalerweise ist es

%Vor%

Und ich brauche diese Aktion, um meine In-App-Kauf-Informationen abzurufen, bevor ich versuche, sie zu verwenden. Das komische daran ist, dass alles andere außer IAsyncAction gut wartet. IAsyncOperation und IAsyncOperationWithProgress funktionierten gut, aber das? Ausnahme und stürzt dann ab.

Um ehrlich zu sein, ich habe keine Ahnung, was der Unterschied zwischen einer IAsyncOperation und einer IAsyncAction ist, sie scheinen mir ähnlich zu sein.

AKTUALISIEREN :

Wenn Sie diese Seite Ссылка analysieren, können Sie herausfinden, dass IAsyncAction nur eine IAsyncOperation ist ohne Rückgabetyp Aber Sie können dann sehen, dass die meisten IAsyncAction-s vergeblich sind. Das eigentliche Problem ist jedoch, dass bestimmte Windows-Funktionen nur für einen bestimmten Thread ausgeführt werden sollen (aus irgendeinem Grund). ReloadSimulatorAsync ist ein solches schönes Beispiel.

Verwenden Sie Code wie folgt:

%Vor%

führt zu einer Endlosschleife. Wenn andere Funktionen aufgerufen werden, funktioniert es tatsächlich. Das Problem hier ist, warum eine Aufgabe auf einem bestimmten Thread ausgeführt werden muss, wenn alles Async ist? Anstelle von Async sollte es RunOn (Main / UI) Thread oder ähnliches sein.

Gelöst , siehe Antwort;

    
RelativeGames 11.11.2013, 22:44
quelle

3 Antworten

4

Dies ist der magische Fix, der den Job erledigt:

%Vor%     
RelativeGames 17.11.2013, 16:48
quelle
4

Wenn Sie wait auf dem concurrency::task aufrufen, nachdem Sie es erstellt haben, wird der Punkt, an dem Aufgaben an erster Stelle stehen, komplett aufgehoben.

Sie müssen wissen, dass es in der Windows-Laufzeit viele asynchrone Operationen gibt, die nicht auf dem UI-Thread ausgeführt werden können (oder sollten). Du hast einen von ihnen gefunden, und jetzt versuchst du darauf zu warten. Anstatt einen Deadlock zu verursachen, erhalten Sie eine Ausnahme.

Um dies zu beheben, müssen Sie eine Fortsetzung verwenden. Du bist am meisten da. Sie definieren bereits eine Fortsetzungsfunktion:

%Vor%

... aber du benutzt es nicht. Der Zweck der Funktion, die Sie in then übergeben, ist aus dem UI-Thread , sobald die Aufgabe abgeschlossen ist. Stattdessen sollten Sie Folgendes tun:

%Vor%

Ihr wichtiger Post-Reload-Code wird erst ausgeführt, wenn die Aufgabe abgeschlossen ist, und er wird in einem Hintergrund-Thread ausgeführt, damit die Benutzeroberfläche nicht blockiert oder blockiert wird.

    
Adam Maras 11.11.2013 23:28
quelle
1

Im Allgemeinen sollten Sie die Fortsetzungen (.then (...)) verwenden, wie Adams Antwort sagt, und nicht blockieren. Nehmen wir an, Sie möchten etwas aus irgendeinem Grund warten (um Code zu testen). Sie können jedoch ein Ereignis aus der letzten Fortsetzung auslösen (um C # zu verwenden):

%Vor%

Übrigens verursacht diese Methode aus irgendeinem Grund eine Ausnahme, wenn sie in visuellen Studiotests beendet ist. Ich habe es aber auch in einer App getestet und es funktionierte ohne Probleme. Ich bin nicht ganz sicher, was das Problem mit dem Test ist.

Wenn jemand ein C ++ / Wrl-Beispiel haben möchte, dann habe ich das auch.

Update 07.08.2017 : Wie hier gefragt, ist ein C ++ / Wrl-Beispiel. Ich habe dies gerade in einem Universal Windows (10) Test-Projekt in Visual Studio 2017 ausgeführt. Der Schlüssel hier ist der seltsame Teil Callback<Implements< RuntimeClassFlags<ClassicCom >, IWorkItemHandler , FtmBase >> , im Gegensatz zu nur Callback<IWorkItemHandler> . Als ich das letztere hatte, war das Programm mit Ausnahme der Zeit, als es in einem .exe-Projekt war. Ich habe diese Lösung hier gefunden: Ссылка . Weitere Informationen finden Sie unter "agile Objekte".

%Vor%

Update 08/08/2017: Mehr Beispiel, nach den Kommentaren.

%Vor%

Dies wird ausgegeben:

  

TestWinRtAsync10

    
Elliot 10.06.2015 17:23
quelle

Tags und Links