c# com outlook mailitem

c# - Cómo liberar Outlook MailItem correcto?



com (4)

Simplemente no puedo liberar mis MailItems de Outlook. Después de abrir 200 correos, Exchange Sever devuelve el máximo de correos electrónicos abiertos.

Eliminaré mi propiedad de usuario de todos los correos seleccionados.

Mi código:

foreach (var selection in Globals.ThisAddIn.Application.ActiveExplorer().Selection) { if (selection is MailItem) { MailItem mi = (MailItem)selection; UserProperty up = mi.UserProperties.Find("MyProp"); if (up != null) { up.Delete(); //################################## // I also tried : //---------------------------------- // Marshal.ReleaseComObject(up); // up = null; //---------------------------------- } mi.Save(); //################################## // I also tried : //---------------------------------- // mi.Close(OlInspectorClose.olDiscard); //---------------------------------- // I don''t know if this loop is necessary, but I have found it somewhere on the web while (Marshal.ReleaseComObject(mi) > 0); mi = null; //################################## // I also tried : //---------------------------------- // GC.Collect(); // GC.WaitForPendingFinalizers(); //---------------------------------- } }

¿Alguna idea de lo que está mal?


Puede intentar esto: en lugar de definir un nuevo MailItem cada vez dentro del bucle For , ¿puede definir mi fuera del bucle For o incluso en su nivel de clase, y reutilizarlo para cada elemento de correo? p.ej:

MailItem mi; foreach (var selection in Globals.ThisAddIn.Application.ActiveExplorer().Selection) { if (selection is MailItem) { mi= (MailItem)selection; // your other code... } } mi=null; GC.Collect(); GC.WaitForPendingFinalizers();

EDITAR:

Intenta crear una variable local para cada referencia, por ejemplo:

Outlook.Explorer myExplorer=Application.ActiveExplorer(); Outlook.Selection mySelection=myexplorer.Selection; foreach (var selection in mySelection) { } myExplorer=null; mySelection=null; //....

EDIT-2:

SI está utilizando Outlook 2010, compruebe esto: selección de complementos de Outlook 2010 no borrado


Creo que es cualquier tipo de error como dijo Bolu. Nuevamente muchas gracias por su ayuda Bolu.

Ahora estoy usando la siguiente solución alternativa:

List entryids = new List(); foreach (var selection in Globals.ThisAddIn.Application.ActiveExplorer().Selection) { MailItem mi = selection as MailItem; if (mi != null) { // For any reason it''s not possible to change the mail here entryids.Add(mi.EntryID); Marshal.ReleaseComObject(mi); mi = null; } } foreach (string id in entryids) { MailItem mi = Globals.ThisAddIn.Application.ActiveExplorer().Session.GetItemFromID(id); // My changes on the mail mi.Save(); Marshal.ReleaseComObject(mi); mi = null; }


Intenta reemplazar foreach con un ciclo for y haz lo siguiente

GC.Collect(); GC.WaitForPendingFinalizer() GC.Collect();

Elimine también toda la referencia a cualquier objeto COM de Outlook que pueda estar usando.


Simplemente coloque el método de liberación fuera de la condición principal if . Se hace referencia a los elementos incluso cuando los recorre con el bucle foreach. Escribir

Marshal.ReleaseComObject(mi)

justo antes del último " } ". Esto funciona para mí Leí que, en general, debe liberar cada objeto COM explícitamente.