gpt4 book ai didi

Outlook 插件 : Working with threads

转载 作者:行者123 更新时间:2023-12-04 15:24:00 26 4
gpt4 key购买 nike

我正在使用 Outlook 插件,我必须处理大量项目。这需要相当多的时间,因此我尝试在不同的线程中运行处理(使用 Task.Factory.StartNew)。但是,这会导致 Outlook 随机崩溃。

我正在使用 Redemption 来处理 MAPITable,以减少工作量并仅加载相关数据。

  • 我已经尝试从我的主线程和我的工作线程初始化我的 RDOSession。
  • 我试过在主线程上获取 MAPIFolders,并且只在工作线程上使用 MAPITable

  • 目前,唯一对我有用的是在主线程上运行我的所有逻辑(在按钮单击事件中),但是这会长时间锁定 Outlook 的用户界面,从用户的角度来看这是 Not Acceptable 。

    有没有人对如何在 Outlook 插件中使用后台线程有一些指导?

    最佳答案

    在我的项目中有类似的代码,我建议如下:

  • 使用 Thread 类创建新线程并将其设置为 STA 单元。
  • 使用 "session.Logon("profileName", NoMail: true, NewSession: false); 登录 session 并且不使用 MAPIOBJECT。我发现它比使用 MAPIOBJECT 具有更好的性能,我猜它仍然将一些调用编码回主线程,因为 MAPIOBJECT 是在主线程上创建的。
  • 使用“Marshal.ReleaseComObject”后,请立即在您使用的每个 COM 对象上使用它们。这可能是导致不稳定的原因,因为 Outlook 真的不喜欢它的对象放置时间过长。例如这行代码“var table = rdoFolder.Items.MAPITable;”创建两个 COM 对象:RDOItems 和 MAPITable,它们都必须释放,因此您需要拆分此行以保存对 RDOItems 对象的引用。
  • 调用 GC.CollectApplication.DoEvents因为如果您不在所有 COM 对象上调用 Marshal.ReleaseComObject,终结器将尝试释放它们并将挂起,因为 COM 对象是在不泵送消息循环的线程上创建的,并且它的终结器方法必须在创建的线程上运行他们。
  • 如果可以,请启动辅助进程并在单独的进程中执行此循环。这将最大程度地分离 UI 和您的后台工作。
  • 关于Outlook 插件 : Working with threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16505507/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com