2016-04-23 11 views
0

Ich bin erfolgreich sehen, wenn neue E-Mail kommt mit der . Dieser Code ist eindeutig ein synchroner Aufruf von Outlook, wie ich es erwarten würde.Outlook VSTO - Synchronisieren Posteingang Status

Ich versuche, den Posteingang zu verarbeiten, nachdem eine einzelne Nachricht eingeht, sodass die Leistung des Empfangsprozesses beeinträchtigt wird. Mein Prozess kann genauso gut (und vorzugsweise) ausgeführt werden, nachdem der gesamte Download abgeschlossen ist.

So scheint es, dass ich einen Event-Handler für den Abschluss des Synchronisierungsprozesses benötigen, und ich kann das in den Klassen Application oder Folder nicht finden.

Wo würde dieser Zustand oder dieses Ereignis versteckt sein?

Antwort

1

Eigentlich ist das Ereignis ItemAdd asynchron und wird ausgelöst, nachdem das Objekt bereits hinzugefügt und gespeichert wurde. Sie haben recht, dass es auf dem Haupt-Outlook-Thread ausgelöst wird.

Sie können warten, bis weitere Elemente hinzugefügt werden, indem Sie einen Timer verwenden - deaktivieren/aktivieren Sie es, wenn das Ereignis ItemAdd ausgelöst wird (wodurch der Timer zurückgesetzt wird). Wenn der Timer später ausgelöst wird (ein paar Sekunden?), Können Sie sicher sein, dass ItemAdd nicht so lange ausgelöst hat wie das Timer-Intervall. Stellen Sie sicher, das Timer-Objekt aus dem Forms-Namespace zu verwenden (es wird auf dem primären Thread ausgelöst).

Sie können auch das Ereignis SyncObject Objekt (SyncStart/SyncEnd/usw. Ereignisse) verwenden. Das allererste Synchronisierungsobjekt in der Namespace.SyncObjects Sammlung ist "Send/Receive All".

Beachten Sie, dass Sie Outlook-Elementverarbeitung nicht zu einem sekundären Thread abladen können - OOM kann nur aus dem Outlook-Hauptthread verwendet werden. Sie benötigen Extended MAPI (nur C++ oder Delphi) oder Redemption (seine RDO Familie von Objekten kann für sekundäre Threads verwendet werden - speichern Sie den Wert Namespace.MAPIOBJECT Property im Hauptthread, erstellen Sie RDOSession Objekt im sekundären Thread, legen Sie die MAPIOBJECT Eigenschaft) .

+0

Ich habe den Pfad zur Verwendung des Timers gestartet und ihn jedes Mal zurückgesetzt, wenn eine eingehende Nachricht empfangen wird. Ja, ich kann das machen, aber es scheint wirklich klatschig. Jede Zeitverzögerung, die ich auswähle, ist rein willkürlich und würde völlig von der Umgebung abhängen, ebenso wie vom Inhalt, wie Zeit bis zu d/l Anhängen. Ich werde das SyncObject untersuchen, um zu sehen, was dazu führen kann. Vielen Dank. – JamieMeyer

+0

Vorläufige Tests zeigten, dass der SyncObject-Ansatz funktioniert hat. Leider basiert dies auf Randfällen - es ist eher die Ausnahme als die Regel. Es ist noch nicht offensichtlich, wenn das SyncEnd-Ereignis aufgerufen wird, aber es basiert eindeutig nicht auf allen Fällen von Empfangen, zumindest basierend auf IMAP/SMTP. Zusätzliche Untersuchungen zeigen, dass dieser Ansatz ebenfalls variiert. Hallo, Microsoft? Wir brauchen hier Hilfe ... – JamieMeyer

+0

Microsoft überwacht SO nicht. Wenn Sie etwas von Microsoft möchten, müssen Sie einen Supportfall öffnen. –