在c#中调用2次的预约项目更改事件

时间:2015-08-25 13:24:31

标签: c# outlook outlook-addin

我正在开发outlook加载项,我必须跟踪约会项目添加,更改和&删除事件。 所以我使用波纹管代码。

   public Microsoft.Office.Interop.Outlook.Application app = null;
   public Outlook.NameSpace ns = null;
   public Outlook.MAPIFolder calendar = null;
   public Outlook.Items appointments = null;

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{
    app = Application;
    ns = app.GetNamespace("mapi");
    ns.Logon("", "", true, true);
    calendar = ns.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
    appointments = calendar.Items;

    appointments.ItemAdd += Item_Add;
    appointments.ItemChange += Item_Change;
    appointments.ItemRemove += Item_Remove;
}

private void Item_Add(object item) 
{
   // some logic
}

private void Item_Change(object item) 
{
  // some logic
}

private void Item_Remove() 
{
  // some logic
}

现在当我在那个时候添加会议时,Item_Add事件被调用。

当我更新创建的会议时,Item_Change事件被触发2次。

我无法理解为什么它会发射2次。

任何人都可以说明理由吗?

3 个答案:

答案 0 :(得分:0)

首先,我建议在全局范围内声明Items对象,以确保垃圾收集器不会刷它。例如,您可以在Startup事件处理程序之外声明Items对象。

更改指定集合中的项目时会触发Items类的ItemChange事件。因此,每次更改任何属性时都会触发它。

答案 1 :(得分:0)

如果项目多次保存,则会多次触发该事件。你应该准备好处理像。

这样的情况

您的事件处理程序应该做什么?为什么这是一个问题?

答案 2 :(得分:0)

我没有找到任何完全清晰的解决方案。我实施的最好的想法是创建已处理任务的列表,并为它们设置时间有效性。

在事件开始时,我检查是否有任何已处理的任务已过时,并将其从列表中删除。这样,我可以使列表保持较小并防止内存泄漏。

non-equi

如果您对有效的解决方案感兴趣,可以在repository中找到以上代码。