我正在创建一个Outlook Mail Item对象并观察Send事件。一切都很好,但是当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事件被引发,从而导致在显示此列表的控件中调用处理程序。我希望这能澄清我想要实现的目标。
答案 0 :(得分:1)
您需要在ItemEvents_10_SendEventHandler()
答案 1 :(得分:1)
在主窗口线程上引发了很多Forms事件,这意味着您通常不必过多担心跨线程问题。但是没有保证,COM通常不会在该线程上引发事件。解决方案是使用方法的委托或匿名块来调用this.Invoke(..)以在正确的线程上执行必要的工作。要测试是否有必要测试this.InvokeRequired。