如何解决由于Outlook加载项中的后台线程导致的挂起问题

时间:2018-12-23 03:27:17

标签: c++ multithreading outlook-addin

我正在为Outlook编写一个加载项(插件)。我的插件中需要一个线程,以便在Outlook的生命周期内保持运行,以处理各种事件并异步执行网络操作。

我为此目的编写了一个后台线程,该线程具有无限循环以保持该线程存活。在正常情况下,它运行良好。但是在以下情况下,这会使前景变得毫无响应:-

步骤1-使Outlook运行。 步骤2-锁定Windows系统 步骤3-1分钟后将其解锁。

当我从Outlook禁用插件时,在同样的情况下,它也能很好地工作。我已经通过以下方式实现了后台线程:-

void BackgroundTaskManager::onDoWork(System::Object^ sender, 
 DoWorkEventArgs^ e)
{
 try
 {
    while (e->Cancel == false)
    {
        mRemoveList->Clear();
        for each(KeyValuePair<uint64_t, BackgroundTask^>^ task in 
          mTasks)
        {
            task->Value->checkStarted();

            if (task->Value->isComplete)
            {
                mRemoveList->Add(task->Key);
            }
        }

        for each(uint64_t taskID in mRemoveList)
        {
            mTasks->Remove(taskID);
            DarkEventLog::Debug(String::Format("Completed task 
            removed. {0}", taskID));
        }
        Sleep(1000);
        if (DarkClientManager::instance->isRunning == false)
            break;
     }
  }
  catch (System::Exception^ ex)
  {
    throw ex;
  }
}

在上面的代码中,即使mtasks和mRemovelists为空,仍然可以从打印中看到Outlook没有响应,并且该线程正在运行。有人可以帮我在这里做错什么吗?

0 个答案:

没有答案