3

我将使用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::CleanUpISearchJob::RequestAbort之间的区别以及如何使用此方法正确停止异步搜索?
  3. 这些方法应该一起使用还是单独使用?
4

1 回答 1

1

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

我不完全确定CleanUp()应该如何使用,但此页面似乎暗示它适用于具有回调的脚本,并且您不应该CleanUp()从回调中调用。不确定您的取消代码在哪里运行。

于 2016-10-13T13:20:28.950 回答