【问题标题】:VSTO Outlook: How to perform a long task without blocking the Outlook main UI threadVSTO Outlook:如何在不阻塞 Outlook 主 UI 线程的情况下执行长任务
【发布时间】:2022-11-19 11:09:01
【问题描述】:

当“收件人”字段从撰写窗口失去焦点时,我需要执行一项需要一些时间才能完成的长任务。现在 UI 被阻塞了,因为我在主 UI 线程中执行它,所以我想让它成为非阻塞的。我考虑过使用 C# 中的 async/await 命令,如下所示:

public async void PerformLongTask()
{
   bool result = await Task.Run(() =>
         {
                // Long task here
         });
}

我想知道这是否是在不阻塞 Outlook 中的主 UI 线程的情况下执行异步任务的正确方法,或者是否有其他更好的方法来做到这一点?如果是这样,如何?当你需要执行这么长的任务并且需要非阻塞时,你通常是怎么做的?

【问题讨论】:

    标签: outlook vsto interop outlook-addin office-addins


    【解决方案1】:

    只要您不接触该辅助线程上的任何 Outlook 对象模型对象,async/await 或任务在 Outlook 中就可以正常工作。

    如果您需要接触 OOM 对象,请切换到主线程,例如使用 Dispatcher 对象 - 在主线程上从 Dispatcher.CurrentDispatcher 检索它,然后在需要时使用 Dispatcher.Invoke/InvokeAsync对 Outlook 对象做任何事情。由于线程切换代价高昂,请尝试将多个 OOM 命中分批处理为单个 Invoke

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多