停止异步ISearchJob的正确方法

Correct way to stop asynchronous ISearchJob

本文关键字:方法 ISearchJob 异步      更新时间:2023-10-16

我将使用WUA API,并以这种方式开始异步搜索更新:

CComPtr<SearchCallbackImpl> iscc_; <<-- Note you need to CreateInstance
CComPtr<ISearchJob> pUpJob_;
pUpJob_ = NULL;
pUpSearcher_->BeginSearch(
        CComVariant(criteria.c_str()).bstrVal,
        iscc_,
        CComVariant(L"Scanning"),
        &pUpJob_);

当我需要停止我的程序,但ISearchJob还没有完成时,我使用以下代码:

if (pUpJob_)
{
    CComVariant isStopped;
    pUpJob_->get_IsCompleted(&isStopped.boolVal);
    if (isStopped.boolVal == VARIANT_FALSE)
    {
        if (SUCCEEDED(pUpJob_->RequestAbort()))
        {
            pUpJob_->CleanUp();
            pUpJob_.Release();
        }
    }
}

通常这段代码工作,但有时它挂在pUpJob_->CleanUp();上,我无法正确停止我的程序。

我的问题是:

  1. 停止异步搜索更新作业的正确方法是什么?
  2. 我也误解了ISearchJob::CleanUp和ISearchJob:: requestort之间的区别,以及如何使用这些方法来正确停止异步搜索?
  3. 这些方法应该一起使用还是单独使用?

RequestAbort()也是异步的(其名称暗示了这一点)。调用后,应调用pUpSearcher_->EndSearch();如果中止成功,它将返回一个ISearchResult,其中ResultCode等于orcAborted然后你可以释放你的资源。

我不完全确定CleanUp()应该如何使用,但这一页似乎暗示它的目的是脚本有回调,你不应该从回调中调用CleanUp()。不确定取消代码在哪里运行