Как правильно дождаться остановки асинхронных функций обратного вызова WinRT?

я задал похожий вопрос раньше, но ответ там не удовлетворил мое требование. Позволь мне объяснить.

Я вызываю следующий код из DLL для выполнения операции WinRT в Windows 10 из приложения Магазина Windows. Код использует WRL:

#include <Windows.Services.Store.h>
#include <wrl.h>

auto onAppLicCompletedCallback = Callback<Implements<RuntimeClassFlags<ClassicCom>, IAsyncOperationCompletedHandler<StoreAppLicense*>, FtmBase>>(
[](IAsyncOperation<StoreAppLicense*>* operation, AsyncStatus status)
{
if(status == AsyncStatus::Completed)
{
//Do actions of the async operation
...
}

return S_OK;
});

//'opAppLic' is defined as:
// ComPtr<IAsyncOperation<StoreAppLicense*>> opAppLic;
// ...

//Begin asynchronous operation
HRESULT hr = opAppLic->put_Completed(onAppLicCompletedCallback.Get());
if (SUCCEEDED(hr))
{
//Keep going ...

//Say, at some point here I need to cancel 'onAppLicCompletedCallback'
//after a user clicks Cancel button via a UI, so I do this:
ComPtr<IAsyncInfo> pAsyncInfo;
if(SUCCEEDED(opAppLic->QueryInterface(__uuidof(pAsyncInfo), &pAsyncInfo)) &&
pAsyncInfo)
{
pAsyncInfo->Cancel();
}
}

//And now unload DLL

но когда я звоню IAsyncInfo::Cancel() метод и сразу же после этого выгрузить DLL, что вызывает состояние гонки и иногда приводит к сбою приложения.

Чисто экспериментально я заметил, что после звонка IAsyncInfo::Cancel() рамки зовут мой onAppLicCompletedCallback метод с status установлен в AsyncStatus::Canceled, Но этот вызов также происходит асинхронно долгое время после IAsyncInfo::Cancel() метод возвращает.

Поэтому мне было интересно, есть ли способ дождаться завершения всех асинхронных обратных вызовов WinRT, прежде чем я смогу продолжить выгрузку своей DLL?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]