加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 02:00:25 所属栏目:百科 来源:网络整理
导读:我正在开发一个Outlook加载项,它挂钩到Application.ItemSend事件中,以便在发送之前对电子邮件进行一些更改.具体来说,它会根据电子邮件内容添加/删除一些附件. 这种后处理涉及到互联网,一些计算以及可能与用户的一些交互.用户甚至可以取消该过程,因此我们可能
我正在开发一个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甚至会再次触发,但你这次可以忽略它(自定义属性或标志?).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读