Comment attendre un IAsyncAction?

Dans les Applications du Windows Store, C++, C# est similaire), de faire quelque chose comme

IAsyncAction^ Action = CurrentAppSimulator::ReloadSimulatorAsync(proxyFile);
create_task( Action ).then([this]()
{
}.wait();

résultats dans une exception non gérée. Habituellement, il est

Microsoft C++ exception: Concurrency::invalid_operation at memory location 0x0531eb58

Et je sorte de besoin pour que l'action de finition pour obtenir mon Achat In-App d'informations avant d'essayer de l'utiliser.
La chose étrange ici, c'est que quelque chose d'autre en plus IAsyncAction attend bien. IAsyncOperation et IAsyncOperationWithProgress a très bien fonctionné, mais cette ? Exception et puis crash.

Pour être honnête, je n'ai aucune idée de quelle est la différence entre un IAsyncOperation et un IAsyncAction, ils semblent similaires à moi.

Mise à JOUR :

Par l'analyse de cette page http://msdn.microsoft.com/en-us/library/vstudio/hh750082.aspx vous pouvez comprendre que IAsyncAction est juste IAsyncOperation sans type de retour. Mais, vous pouvez alors voir que la plupart des IAsyncAction-s sont waitable. Le vrai problème, c'est que certaines fonctions de Windows voulez juste pour s'exécuter sur un fil (pour certaines raisons). ReloadSimulatorAsync en est un bel exemple.

À l'aide de code comme ceci :

void WaitForAsync( IAsyncAction ^A )
{   
    while(A->Status == AsyncStatus::Started)
    {
        std::chrono::milliseconds milis( 1 );
        std::this_thread::sleep_for( milis );
    }   
    AsyncStatus S = A->Status;  
}

résultats dans une boucle infinie. S'il est appelé à d'autres fonctions qu'il fonctionne réellement. Le problème ici, c'est pourquoi les tâches doivent être exécutées sur un thread particulier si tout est Asynchrone ? Au lieu de l'Asynchrone, il devrait être RunOn(Principal/UI Thread ou similaire.

RÉSOLU, voir la réponse;

Je crois IAsyncOperation renvoie un résultat et IAsyncAction ne le fait pas. Je ne sais pas si IAsyncAction est awaitable ou pas, à vrai dire. En C#, awaitable méthodes asynchrones de type de retour de la Tâche ou des Tâches<TResult>. Pouvez-vous attendre Action? Je ne sais pas si C++ a async/await.
Je suis en attente avec la "}.wait ();", c'est l'attendent C# équivalent, donc oui IAsyncAction est awaitable. Une autre chose étrange est que, au lieu de create_task je peux appeler tâche<void>, et a le même effet que de jeter l'exception.
Juste une remarque: le task::wait n'est pas l'équivalent de C# await mot-clé. await , le compilateur de restructurer le code dans les continuations de derrière les coulisses.
A obtenu une référence pour qui ? Je pense que ce serait rendre les choses extrêmement difficiles à suivre. MessageDialog::ShowAsync (par exemple) n'est appelable depuis le Thread d'INTERFACE utilisateur. Dans le scénario que vous décrivez si elle s'exécute sur un thread d'arrière-plan lorsque vous pensez que vous êtes sur le thread de l'INTERFACE utilisateur, il va provoquer un plantage/exception.
C#, programmeurs vous cherchez GetAwaiter() sur IAsyncAction - vous besoin d'ajouter using System; et une référence à System.Runtime.WindowsRuntime.dll de c:\Program Files (x86)\de Référence Assemblées\Microsoft\Framework\.NETCore\v4.5\ ou similaire.

OriginalL'auteur RelativeGames | 2013-11-11