Проблема при циклическом прохождении всех элементов назначения календаря - PullRequest
0 голосов
/ 10 октября 2018

мне нужно получить все AppointmentItems из календаря, но после нескольких элементов я получил исключение с ошибкой, которая говорит о том, что максимальное количество открытых элементов ограничено.Я не зацикливаю их через цикл foreach, поэтому не должно быть проблем со ссылкой.Я немедленно "конвертирую" эти Предметы в свой Тип Предмета, чтобы я мог Освободить Объекты.Я также установил нулевую ссылку на объект после того, как выпустил объект и попытался вызвать сборщик мусора, но ошибка все еще возникает.

Items items = application.Session.GetFolderFromID(MainCalendar).Items;
for(Int32 i = 1; i < items.Count; i++)
{
    AppointmentItem appointmentItem = items[i] as AppointmentItem;
    TempOutlookAppointment tempApp = new TempOutlookAppointment();
    tempApp.FillFromAppointmentItem(appointmentItem);
    appointmentItem.Close(OlInspectorClose.olDiscard);
    Marshal.ReleaseComObject(appointmentItem);
    appointmentItem = null;
    GC.Collect();
    // Adding tempApp to a List
}



// FillFromAppointmentItem
public void FillFromAppointmentItem(Microsoft.Office.Interop.Outlook.AppointmentItem appointmentItem)
{
        AllDayEvent = appointmentItem.AllDayEvent;
        Body = appointmentItem.Body;
        End = appointmentItem.End;
        Location = appointmentItem.Location;
        OutlookLinkID = appointmentItem.UserProperties.Find("LINKID") != null
            ? Guid.Parse(appointmentItem.UserProperties.Find("LINKID").Value.ToString())
            : Guid.Empty;
        Start = appointmentItem.Start;
        if (appointmentItem.IsRecurring)
        {
            Microsoft.Office.Interop.Outlook.RecurrencePattern pattern = appointmentItem.GetRecurrencePattern();
            TerminSerie serie = new TerminSerie()
            {
                MaxOccurences = pattern.Occurrences,
                PatternDayOfMonth = pattern.DayOfMonth,
                PatternFrequency = pattern.RecurrenceType == Microsoft.Office.Interop.Outlook.OlRecurrenceType.olRecursDaily ? PatternFrequency.Daily : pattern.RecurrenceType == Microsoft.Office.Interop.Outlook.OlRecurrenceType.olRecursMonthly ? PatternFrequency.Monthly : pattern.RecurrenceType == Microsoft.Office.Interop.Outlook.OlRecurrenceType.olRecursWeekly ? PatternFrequency.Weekly : PatternFrequency.Yearly,
                PatternInterval = pattern.RecurrenceType == Microsoft.Office.Interop.Outlook.OlRecurrenceType.olRecursMonthly ? pattern.Interval / 12 : pattern.Interval,
                PatternMonthOfYear = pattern.MonthOfYear,
                RangeEndDate = pattern.PatternEndDate,
                RangeLimit = pattern.NoEndDate ? RangeLimit.NoLimit : pattern.Occurrences > 0 ? RangeLimit.ByOccurences : RangeLimit.ByDate,
                RangeStartDate = pattern.PatternStartDate
            };
            Int32 i = pattern.DayOfWeekMask.GetHashCode();
            List<System.DayOfWeek> days = new List<System.DayOfWeek>();
            if (i >= 64)
            {
                days.Add(System.DayOfWeek.Saturday);
                i -= 64;
            }
            if (i >= 32)
            {
                days.Add(System.DayOfWeek.Friday);
                i -= 32;
            }
            if (i >= 16)
            {
                days.Add(System.DayOfWeek.Thursday);
                i -= 16;
            }
            if (i >= 8)
            {
                days.Add(System.DayOfWeek.Wednesday);
                i -= 8;
            }
            if (i >= 4)
            {
                days.Add(System.DayOfWeek.Tuesday);
                i -= 4;
            }
            if (i >= 2)
            {
                days.Add(System.DayOfWeek.Monday);
                i -= 2;
            }
            if (i == 1)
            {
                days.Add(System.DayOfWeek.Sunday);
            }
            serie.PatternDaysOfWeek = days;
        }
        Subject = appointmentItem.Subject;
    }

Я надеюсь, что вы можете помочь мне с моей проблемой.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

У вас все еще есть неявная переменная.Измените следующее

AppointmentItem appointmentItem = items[i] as AppointmentItem;
...
Marshal.ReleaseComObject(appointmentItem);

на

object item = items[i];
AppointmentItem appointmentItem = item as AppointmentItem;
...
Marshal.ReleaseComObject(appointmentItem);
Marshal.ReleaseComObject(item);
0 голосов
/ 10 октября 2018

5 дней. Я просто не понял, почему это не работает, теперь я случайно нашел решение.

Для тех, у кого такая же проблема: мне просто нужно было изменить эту строку:

Marshal.ReleaseComObject(appointmentItem);

к этому:

while(Marshal.ReleaseComObject(appointmentItem) > 0)
    Marshal.ReleaseComObject(appointmentItem);

Не знаю почему, но это работает сейчас.

...