如何取消C ++/WRL中的异步回调函数?
我正在使用 C ++/WRL编写Windows 10 Store/WinRT代码一个>我是新来的.而且我很想知道如何取消长期等待的异步操作?
I'm writing Windows 10 Store / WinRT code using C++/WRL which I'm new to. And I'm curious to know how do I cancel long-pending asynchronous operation?
最好的例子是这个例子:
The best way to illustrate it is with this example:
#include <Windows.Services.Store.h>
#include <wrl.h>
auto onAppLicCompletedCallback = Callback<Implements<RuntimeClassFlags<ClassicCom>, IAsyncOperationCompletedHandler<StoreAppLicense*>, FtmBase>>(
[](IAsyncOperation<StoreAppLicense*>* operation, AsyncStatus status)
{
//Asynchronous operation is done
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'
//but how do I do it?
}
编辑:当我尝试按照以下答案中的建议添加opAppLic->Cancel()
时,它给了我以下编译器错误:
When I tried to add opAppLic->Cancel()
as was suggested in the answer below, it gave me the following compiler error:
1>file-name.cpp(597): error C2039: 'Cancel' : is not a member of 'Microsoft::WRL::Details::RemoveIUnknownBase<T>'
1> with
1> [
1> T=ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Services::Store::StoreAppLicense*>
1> ]
我需要代替QueryInterface
那个IAsyncInfo
还是什么?
Do I need to QueryInterface
that IAsyncInfo
instead, or what?
这是我对opAppLic
变量类型的了解:
This is what I'm getting for the type of opAppLic
variable:
不,它没有Cancel
方法:
谁也遇到了这个问题.我想我明白了. Remy Lebeau 部分正确.我需要做的是像这样通过QueryInterface
获得IAsyncInfo
:
Whoever also runs into this. I think I got it. Remy Lebeau was partially correct. What I needed to do was to obtain IAsyncInfo
via QueryInterface
as such:
ComPtr<IAsyncInfo> pAsyncInfo;
if(SUCCEEDED(opAppLic->QueryInterface(__uuidof(pAsyncInfo), &pAsyncInfo)) &&
pAsyncInfo)
{
if(SUCCEEDED(pAsyncInfo->Cancel()))
{
//Async op was now canceled
//Also note that `onAppLicCompletedCallback` will be called
//with `status` set to `Canceled`
}
}