2

我正在创建一个 Outlook 邮件项对象并监视发送事件。一切看起来都很好,但是当 Send 事件触发时,该事件会在我的应用程序的后台线程上引发。这是一个问题的原因是此事件创建了通过我的应用程序发送的电子邮件的记录,该记录被添加到对象集合中。因此,该集合在后台线程上引发 List Changed 事件,从而导致对显示该集合的控件进行跨线程控件访问。

这是我的活动联播:

((Outlook.ItemEvents_10_Event)item).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(ItemSendWatcher_Send);

该事件连接在一个基本类中,该类包含对正在发送的消息的引用,以及在引发发送事件时调用的委托。这允许我将电子邮件对象的实例传递给委托。

这是我的处理程序:

void ItemSendWatcher_Send(ref bool Cancel)
    {
        if (itemSendDelegate != null)
        {
            this.itemSendDelegate(this.item, ref Cancel); //The delegate with the mail item
        }
        Marshal.ReleaseComObject(item);
        itemSendDelegate = null;
    }

这是此事件的正确行为还是我在构造对象时做错了什么?谢谢你的帮助。

编辑:澄清一下,我不是在 UI 层中处理事件,而是在业务对象中。从发送事件处理程序调用的委托会在内部将一个新对象添加到列表中,这会导致引发列表的 ListChanged 事件,从而导致在显示此列表的控件中调用处理程序。我希望这能澄清我想要实现的目标。

4

2 回答 2

1

你需要在里面处理 InvokeRequired + InvokeItemEvents_10_SendEventHandler()

于 2010-09-03T11:31:12.363 回答
1

在主窗口线程上引发了很多 Forms 事件,这意味着您通常不必过多担心跨线程问题。但是,没有任何保证,COM 通常不会在该线程上引发事件。解决方案是调用 this.Invoke(..) 并使用方法委托或匿名块在正确的线程上执行必要的工作。要测试这是否是必要的,请测试 this.InvokeRequired。

于 2010-09-03T12:26:19.230 回答