多线程Outlook Application.ItemSend事件?

时间:2014-03-03 16:59:20

标签: c# multithreading outlook vsto outlook-addin

我正在开发一个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 */
    }
}

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

不支持在后台线程上使用OOM。