Как ждать IAsyncAction?
В приложениях Магазина Windows C ++ (хотя C # похож), делая что-то вроде
IAsyncAction^ Action = CurrentAppSimulator::ReloadSimulatorAsync(proxyFile);
create_task( Action ).then([this]()
{
}.wait();
приводит к необработанному исключению. Обычно это
Microsoft C++ exception: Concurrency::invalid_operation at memory location 0x0531eb58
И мне нужно завершить это действие, чтобы получить информацию о покупке внутри приложения, прежде чем пытаться ее использовать. Странная вещь здесь в том, что все остальное, кроме IAsyncAction, ждет просто отлично. IAsyncOperation и IAsyncOperationWithProgress работали просто отлично, но это? Исключение, а затем сбой.
Если честно, я понятия не имею, в чем разница между IAsyncOperation и IAsyncAction, они кажутся мне похожими.
ОБНОВИТЬ :
Анализируя эту страницуhttp://msdn.microsoft.com/en-us/library/vstudio/hh750082.aspx вы можете выяснить, что IAsyncAction - это просто IAsyncOperation без типа возврата. Но вы можете видеть, что большинство IAsyncAction-s являются ожидаемыми. Однако реальная проблема заключается в том, что определенные функции Windows просто хотят выполняться в определенном потоке (по какой-то причине). ReloadSimulatorAsync - один из таких прекрасных примеров.
Используя такой код:
void WaitForAsync( IAsyncAction ^A )
{
while(A->Status == AsyncStatus::Started)
{
std::chrono::milliseconds milis( 1 );
std::this_thread::sleep_for( milis );
}
AsyncStatus S = A->Status;
}
приводит к бесконечному циклу. При вызове других функций это действительно работает. Проблема здесь в том, почему задача должна выполняться в определенном потоке, если все работает в асинхронном режиме? Вместо Async это должен быть RunOn (Main / UI) Thread или аналогичный.
РЕШИТЬсм. ответ;