Ich entwickle ein Outlook-Add-in, das mit einem Server über PHP kommuniziert.Outlook-Element ändern Ereignisse in C# fehlgeschlagen
Ich synchronisiere Daten zwischen Outlook-Elementen und Serverdaten.
Immer wenn der Benutzer eine Änderung an einem Element vornimmt (wie Drag'n'Drop im Kalender eines Termins zu einem anderen Datum oder einige Werte/Notizen ändern), wird das Elementwechselereignis ausgelöst und eine Synchronisation ausgelöst das passiert. Der Server sendet manchmal Daten zurück, die dann wiederum in das Outlook-Element geschrieben werden. In diesem Fall wird das Ereignis jedoch deaktiviert, sodass keine Kaskadierung stattfindet. Das ist alles gut, aber hier kommt die schlechte Sache:
Ich habe etwas wirklich merkwürdig bemerkt. Nachdem das Ereignis ausgelöst wurde und alles korrekt ist, entscheidet Outlook manchmal, das Ereignis noch einmal (oder sogar mehrmals) nach ein paar Sekunden (im Bereich von ~ 3 Sekunden bis ~ 22 Sekunden) auszulösen.
Das ist sehr unberechenbar und super nervig, da die Synchronisation auf den Items LastModificationTime beruht, die durch diese zufälligen Elementänderungen geändert werden.
Gibt es Möglichkeiten, diese Ereignisse zu deaktivieren oder sie zumindest von tatsächlichen Benutzeraktionen zu unterscheiden?
Ich habe auch die Ereignisse mit dem Add-In von Add-In-Express überwacht, und ich habe auch einige seltsame Aktivitäten dort.
Ich habe es auf mehreren PCs versucht, mit verschiedenen Versionen von Outlook/Windows installiert, und es passiert ziemlich viel überall.
Hier ist, wo ich die Ereignisse ein:
public static Outlook.ItemsEvents_ItemChangeEventHandler AppointmentChangeHandler;
public static Outlook.ItemsEvents_ItemChangeEventHandler TaskChangeHandler;
public static Outlook.Items appointments = null;
public static Outlook.Items tasks = null;
public void SetupEventHandlers()
{
Outlook.Application app = Globals.ThisAddIn.Application;
Outlook.NameSpace ns = app.GetNamespace("mapi");
Outlook.MAPIFolder calendar = null;
Outlook.MAPIFolder tasksfolder = null;
try
{
calendar = OutlookHelper.GetMAPIFolderByName("Calendar Where I want my events to work");
if (calendar != null)
{
appointments = calendar.Items;
AppointmentChangeHandler = new Outlook.ItemsEvents_ItemChangeEventHandler(Item_ItemChange);
appointments.ItemChange += AppointmentChangeHandler;
}
}
catch (Exception ex)
{
//failed to get calendar, and to add the itemchange event
}
try
{
tasksfolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks);
tasks = tasksfolder.Items;
TaskChangeHandler = new Outlook.ItemsEvents_ItemChangeEventHandler(Item_ItemChange);
tasks.ItemChange += TaskChangeHandler;
}
catch (Exception ex)
{
//failed to get tasks folder, and to add the itemchange event
}
}
Und hier ist der Event-Handler:
public static void Item_ItemChange(object Item)
{
if (Item.LastModificationTime() > Item.LastSync().AddSeconds(2) && !ProgrammaticChange) //I try to do something here: checking if the lastmodification time is more than 2 seconds after the last synchronization time, but as i said, it sometimes adds 22 seconds, sometimes 0...
{
ProgrammaticChange = true; //closing the door, so no cascading happens
SyncItem(Item); //this can change values on the outlook items, that could eventually trigger another event, but the boolean flag is true, so the event will not happen
ProgrammaticChange = false; //opening the door for new events
}
}
Können Sie bitte den Code zeigen, den Sie schon seit einiger Zeit kennen. Danke –
Hallo Jeremy! Danke für die Antwort, ich habe nur ein paar Code-Schnipsel hinzugefügt. – Laureant