Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在后台线程上引发Outlook电子邮件发送事件_C#_.net_Outlook 2007_Outlook Object Model - Fatal编程技术网

C# 在后台线程上引发Outlook电子邮件发送事件

C# 在后台线程上引发Outlook电子邮件发送事件,c#,.net,outlook-2007,outlook-object-model,C#,.net,Outlook 2007,Outlook Object Model,我正在创建Outlook邮件项目对象并监视发送事件。看起来一切正常,但当发送事件触发时,该事件将在我的应用程序的后台线程上引发。这是一个问题的原因是此事件创建了通过我的应用程序发送的电子邮件的记录,该记录被添加到对象集合中。因此,集合在后台线程上引发List Changed事件,导致对显示集合的控件进行跨线程控件访问 以下是我的活动连接: ((Outlook.ItemEvents_10_Event)item).Send += new Microsoft.Office.Interop.Outloo

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

以下是我的活动连接:

((Outlook.ItemEvents_10_Event)item).Send += new Microsoft.Office.Interop.Outlook.ItemEvents_10_SendEventHandler(ItemSendWatcher_Send);
该事件连接在一个基本类中,该类包含对正在发送的消息的引用,以及在引发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事件,从而在显示此列表的控件中调用处理程序。我希望这澄清了我试图实现的目标。

您需要在
ItemEvents\u 10\u SendEventHandler()内处理invokererequired+Invoke。
在主窗口线程上引发了许多表单事件,这意味着您通常不必太担心跨线程问题。但是,没有任何保证,COM通常不会在该线程上引发事件。解决方案是调用this.Invoke(..),使用方法的委托或匿名块在正确的线程上执行必要的工作。要测试这是否必要,请测试this.InvokeRequired。

您能显示更多的代码吗?现在稍微清楚一点,这是一个已知的问题:我假设您的意思是在类中创建一个控件实例,允许我使用control.invoke调用处理程序。invoke?不,只需查看如何使用control.invoke和InvokeRequired。创建控件没有什么特别之处。发布eventhandler的代码以获得更好的答案。问题中包含事件处理程序的代码。添加到问题的更多信息。Invoke和InvokeRequired不可用,因为类不是控件。这就是为什么我在对上一个答案的评论中问我是否需要创建一个控件的实例以允许我调用Invoke。你需要对处理程序中正在更改的任何内容使用Invoke-显示列表的控件。我明白了-这很有意义!问题是,在处理事件的任何阶段,我都无法访问该控件,除非在我的集合类中引发list changed事件。我想是时候重构了!