Outlook COMException

System.Runtime.InteropServices.COMException .. Администратор вашего сервера ограничил количество элементов, которые вы можете открывать одновременно...

в Microsoft.Office.Interop.Outlook._AppointmentItem.get_UserProperties()

        var calendar = outlookApplication.GetNamespace("MAPI").GetDefaultFolder(OlDefaultFolders.olFolderCalendar);

        if (calendar == null || calendar.Items == null)
        {
            return null;
        }

        var calendarItems = calendar.Items;

        if (calendarItems != null && calendarItems.Count > 0)
        {
            // Dont convert to LINQ or foreach please -> may cause Outlook memory leaks. 
            for (int counter = 1; counter <= calendarItems.Count; counter++)
            {
                var appointment = calendarItems[counter] as AppointmentItem;

                if (appointment != null)
                {
                    var userProperty = appointment.UserProperties.Find("myInformation");

                    if (userProperty != null && userProperty.Value == myValue)
                    {
                        return appointment ;
                    }
                }
            }
        }

Может быть, его назначение.UserProperties.Find("myInformation") вызывает COMException?


person MikroDel    schedule 07.11.2012    source источник
comment
спасибо за голоса) это значит, что кто-то прочитал это и нашел это хорошим)   -  person MikroDel    schedule 20.11.2012
comment
вы нашли какое-нибудь решение?   -  person Florian    schedule 27.03.2013
comment
@ Anubis1233 - я опубликовал свой ответ   -  person MikroDel    schedule 02.04.2013
comment
спасибо, но я уже использовал ограничения :/   -  person Florian    schedule 02.04.2013
comment
@ Anubis1233 Anubis1233 у вас есть исключение при использовании Restrict? Вы создали вопрос со своей проблемой?   -  person MikroDel    schedule 02.04.2013
comment
Да, у меня есть исключение с Recrict. К сожалению, это случайное исключение. Я исправил это, обрезав результат после первых 5 результатов. Мой администратор Exchange заверил меня, что эта ошибка не должна возникать при таком малом количестве записей.   -  person Florian    schedule 02.04.2013
comment
@ Anubis1233 Anubis1233, может быть, вы опубликуете это как вопрос? С исходным кодом. Может быть, вы станете лучшим решением, чем ваше.   -  person MikroDel    schedule 02.04.2013


Ответы (3)


Когда закончите с Outlook Mailitem, закройте его, а затем отпустите.

For Each item As Outlook.MailItem In oFolder.Items
  '<process item code>

  'Close the item
    'SaveMode Values
    'olDiscard  = 1
    'olPromptForSave = 2
    'olSave = 0
  item.Close(1)

  'Release item
  Marshal.ReleaseComObject(item)
Next
person CareyG    schedule 23.05.2013

Вы должны убедиться, что вы освобождаете элементы Outlook, как только вы закончите с ними, используя Marshal.ReleaseComObject(), вместо того, чтобы ждать, пока включится сборщик мусора.

Вам также необходимо избегать многоточечной нотации, чтобы убедиться, что вы не получаете неявные переменные (созданные компилятором), которые содержат эти промежуточные результаты и на которые нельзя явно ссылаться и освобождать.

person Dmitry Streblechenko    schedule 02.04.2013
comment
Отлично, спасибо - у меня была та же проблема, я всегда закрывал объект, но выпуск ComObject был решением :) - person Jan021981; 25.03.2021

Я нашел решение для этого. Нет необходимости использовать Find, потому что Restrict сделать то, что мне нужно.

...
string filter = string.Format("[myInformation] = '{0}'", myInformation);
var calendarItems = calendar.Items.Restrict(filter);
...
person MikroDel    schedule 02.04.2013