IWbemServices::CancelAsyncCall 方法 (wbemcli.h)

IWbemServices::CancelAsyncCall 方法根据最初传递给异步方法的 IWbemObjectSink 指针取消任何当前挂起的异步调用。 未完成的 IWbemObjectSink 指针可以在调用之前或调用返回后释放。 CancelAsyncCall 方法不能从接收器中操作,并且不受方法提供程序的支持。 这意味着仅取消调用的客户端。 实现提供程序不会收到已取消调用并运行到完成的通知。 在取消需要很长时间才能完成的方法(如 Win32_Volume 类中的 DefragFormat 方法)之前,应考虑这 点。

语法

HRESULT CancelAsyncCall(
  [in] IWbemObjectSink *pSink
);

参数

[in] pSink

指向客户端提供的 IWbemObjectSink 实现的指针,指向 IWbemServices 的任何异步方法。

返回值

此方法返回指示方法调用状态的 HRESULT。 以下列表列出了 HRESULT 中包含的值。

失败时,可以从 COM 函数 GetErrorInfo 获取可用信息。

如果网络问题导致你失去与 Windows 管理的远程连接,也可以返回特定于 COM 的错误代码。

注意如果在 WMI 处理 CancelAsyncCall 时尚未在应用程序的接收器上调用 SetStatus,则 WMI 会调用该接收器上的 SetStatus,WBEM_E_CALL_CANCELLED作为hResult 参数的值。
 
计时和异步操作的性质可能会影响 WMI 是否能够取消操作。 只有较长的查询才有可能在完成之前被成功取消。 在 WMI 处理 CancelAsyncCall 调用之前,通常会完成更快的操作,例如异步删除或修改。 因此,当 CancelAsyncCall 尝试取消当前操作时,有时只需释放 IWbemObjectSink 指针即可。
注意 可以使用同一对象接收器进行大量异步调用。 在这种情况下, CancelAsyncCall 方法将取消共享此对象接收器的所有异步调用。 强烈建议为每个未完成的异步调用创建对象接收器的一个实例。
 

注解

由于可能不会以客户端要求的相同身份验证级别返回对接收器的回调,因此建议使用半同步通信而不是异步通信。 有关详细信息,请参阅调用方法。 从 IWbemObjectSink::Indicate 或 IWbemObjectSink::SetStatus 的实现中调用 CancelAsyncCall 可能会干扰 WMI 状态,不建议这样做。

在方法调用(如 ExecMethodAsync)的情况下,仅取消调用的客户端。 实现提供程序不会收到已取消调用并运行到完成的通知。

有关如何使用异步调用的详细信息,请参阅 使用 C++ 进行异步调用接收异步事件通知

示例

有关使用 CancelAsyncCall 的完整示例,请参阅 示例:通过 WMI 接收事件通知

以下 C++ 示例摘自 \\Program Files\Microsoft SDKs\Windows\v7.0\Samples\sysmgmt\wmi\vc\decoupled\instance_provider 示例,演示 了 CancelAsyncCall 的实现。
HRESULT CProvider_IWbemServices :: CancelAsyncCall ( 
  
 IWbemObjectSink *a_Sink
)
{
 HRESULT t_Result = WBEM_E_NOT_AVAILABLE ;
 return t_Result ;
}

要求

要求
最低受支持的客户端 Windows Vista
最低受支持的服务器 Windows Server 2008
目标平台 Windows
标头 wbemcli.h (包括 Wbemidl.h)
Library Wbemuuid.lib
DLL Fastprox.dll;Esscli.dll;FrameDyn.dll;FrameDynOS.dll;Ntevt.dll;Stdprov.dll;Viewprov.dll;Wbemcomn.dll;Wbemcore.dll;Wbemess.dll;Wbemsvc.dll;Wmipicmp.dll;Wmidcprv.dll;Wmipjobj.dll;Wmiprvsd.dll

另请参阅

IWbemObjectSink

IWbemServices