Как дождаться завершения всех выполненных AsyncOperations в приложении - PullRequest
0 голосов
/ 28 января 2020

Я отправляю сообщения, используя асинхронную операцию записи, но когда приложение закрыто, мне нужно записать 2 сообщения на устройство, но успешно записывается только 1 сообщение.

Каждая операция записи связана с очередь сообщений, поэтому операции записи сообщений отправляются последовательно после каждой завершенной операции записи, пока очередь сообщений заполнена. Таким образом, следующий код может получить первый завершенный обратный вызов, но он не достигнет второго, пока приложение не закроется. Я пытался добавить вызов Windows Sleep между и после операций Asyn c, но это не сработало. Я также протестировал ожидание обратного вызова завершения, используя while l oop, чтобы увидеть, завершается ли когда-либо вторая операция, чего она никогда не делает.

    ComPtr<IAsyncOperation<GattCommunicationStatus>> writeOp;
    GattWriteOption option = GattWriteOption_WriteWithoutResponse;
    hr = customCharacteristic->WriteValueWithOptionAsync(buffer.Get(), option, &writeOp);
    hr = writeOp->put_Completed(Callback<IAsyncOperationCompletedHandler<GattCommunicationStatus>>
                (this, &DataGloveBluetooth::OnCharacteristicWriteComplete).Get());

Это проблема только при закрытии приложения, так как кажется, что вторая операция никогда не добирается до обратного вызова. Кроме того, сообщения слишком велики, чтобы их можно было объединить, поэтому мне нужно иметь возможность отправлять более 1 сообщения.

Есть ли правильный способ ожидания? Вот некоторый псевдокод, помогающий объяснить порядок:

WriteMessage(LED_RESET); // adds to message queue, then calls aync op, 
WriteMessage(CLOSE); // adds to message queue, async op is called once first message is sent, complete callback is never reached
Sleep(5000) // whatever sleep amount never helps the 2nd message finish
...