我正在开发一个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 */
}
}
答案 0 :(得分:7)
取消提交,保存邮件,阅读其条目ID。启动一个单独的线程来进行处理(不要触摸该线程中的OOM!)。当辅助线程完成时,运行将通过其条目ID重新打开项目的主线程代码并修改附件,再次发送消息。 ItemSend甚至会再次触发,但你这次可以忽略它(自定义属性或标志?)。
答案 1 :(得分:0)
不支持在后台线程上使用OOM。