я задал похожий вопрос раньше, но ответ там не удовлетворил мое требование. Позволь мне объяснить.
Я вызываю следующий код из 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?
Задача ещё не решена.
Других решений пока нет …