Jak czekać na IAsyncAction?
W Windows Store Apps, C ++ (C # jest podobny), robi coś takiego
IAsyncAction^ Action = CurrentAppSimulator::ReloadSimulatorAsync(proxyFile);
create_task( Action ).then([this]()
{
}.wait();
skutkuje nieobsługiwanym wyjątkiem. Zwykle jest
Microsoft C++ exception: Concurrency::invalid_operation at memory location 0x0531eb58
Potrzebuję tej akcji, aby uzyskać informacje o zakupie In App przed próbą użycia. Dziwne jest to, że cokolwiek innego oprócz IAsyncAction czeka dobrze. IAsyncOperation i IAsyncOperationWithProgress działały dobrze, ale to? Wyjątek, a następnie zawieszenie.
Szczerze mówiąc, nie mam pojęcia, jaka jest różnica między IAsyncOperation a IAsyncAction, wydają się podobne do mnie.
AKTUALIZACJA :
Analizując tę stronęhttp://msdn.microsoft.com/en-us/library/vstudio/hh750082.aspx możesz dowiedzieć się, że IAsyncAction jest tylko IAsyncOperation bez typu powrotu. Ale możesz wtedy zobaczyć, że większość IAsyncAction-s jest oczekiwana. Prawdziwym problemem jest jednak to, że niektóre funkcje Windows po prostu chcą wykonać na konkretnym wątku (z jakiegoś powodu). ReloadSimulatorAsync jest jednym z takich dobrych przykładów.
Używając takiego kodu:
void WaitForAsync( IAsyncAction ^A )
{
while(A->Status == AsyncStatus::Started)
{
std::chrono::milliseconds milis( 1 );
std::this_thread::sleep_for( milis );
}
AsyncStatus S = A->Status;
}
skutkuje nieskończoną pętlą. W przypadku wywołania innych funkcji faktycznie działa. Problem polega na tym, dlaczego zadanie musi być wykonywane na konkretnym wątku, jeśli wszystko jest asynchroniczne? Zamiast Async powinien być RunOn (Main / UI) Thread lub podobny.
ROZWIĄZANY, Zobacz odpowiedź;