gpt4 book ai didi

c# - 多线程 Outlook Application.ItemSend 事件?

转载 作者:行者123 更新时间:2023-11-30 13:57:16 34 4
gpt4 key购买 nike

我正在开发一个 Outlook 加载项,它连接到 Application.ItemSend 事件,以便在发送电子邮件之前对其进行一些更改。具体来说,它会根据电子邮件内容添加/删除一些附件。

此后处理涉及到互联网、一些计算以及可能与用户的一些交互。用户甚至可以取消该过程,因此我们可能需要通过将 ItemSend 事件处理程序的 Cancel 参数设置为 true 来完全取消发送。

问题是,虽然这通常很快,但可能需要一段时间 - 在此期间 Outlook 会完全卡住。

那么,我怎样才能在单独的线程中执行此操作,同时仍然保留取消发送的权利?似乎延迟发送的唯一方法是实际阻止整个消息线程,这看起来……很奇怪。

代码:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Application.ItemSend+=OnItemSend;
}

private void OnItemSend(object Item, ref bool Cancel)
{
Outlook.MailItem mail=Item as Outlook.MailItem;
if (mail!=null)
{
Outlook.Attachments atts=mail.Attachments;

/* ...lengthy processing on 'atts', during which Outlook is frozen... */

Cancel=/* result of lengthy processing */
}
}

最佳答案

取消提交,保存消息,读取条目id。启动一个单独的线程来进行处理(不要触及该线程中的 OOM!)。当辅助线程完成时,在主线程上运行代码,该代码将通过其条目 ID 重新打开项目并修改附件,再次发送消息。 ItemSend 甚至会再次触发,但这次您可以忽略它(自定义属性或标志?)。

更新(2019 年)- 请记住,Outlook 2016 或更新版本一旦检测到对辅助线程的访问就会引发异常。如果您需要接触 OOM,您只能在插件的主线程上进行。如果您需要在辅助线程上访问任何 Outlook 数据,您只能使用扩展 MAPI(C++ 或 Delphi)或 Redemption (任何语言,我都是它的作者 - RDOSession 对象可以在辅助线程上访问:将 Namespace.MAPIOBJECT 属性的值保存在专用变量中,然后在辅助线程上创建一个RDOSession 的新实例 - 将在该线程上初始化 MAPI 系统 - 并将 RDOSession.MAPIOBJECT 属性设置为保存在辅助线程上的值)。

关于c# - 多线程 Outlook Application.ItemSend 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22152661/

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