Исключение из-за нехватки памяти при запуске двух задач (Outlook VSTO) - PullRequest
0 голосов
/ 26 сентября 2018

Я разрабатываю надстройку ac # для Outlook 2016. В некоторых процедурах мне нужно удалить категорию почтового элемента и свойства пользователя.Я пытаюсь сделать это, удалив свойства из папки входящих / отправленных одновременно.Для этого я запускаю 2 новых tasks:

Task.Factory.StartNew(() => RunRemovingExistingVisualIndicationFromInboxFolder(), GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.Token);
Task.Factory.StartNew(() => RunRemovingExistingVisualIndicationFromSentFolder(), GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.Token);

В моем коде ниже есть функция, которая удаляет эти свойства (например, я прикрепляю только обработку почтовых элементов в папке «Входящие». Примечание: то же самое)Код используется для моей папки «Отправленные». Я только изменил папку Outlook, чтобы использовать папку «Отправленные».)

    public static void RunRemovingExistingVisualIndicationFromInboxFolder()
    {
        NLogMethods.GetInstance().WriteInfoLog("[ADDITIONALVISUALINDICATIONSETTINGSFORM -> RUNREMOVEEXISTINGVISUALINDICATION()]: Processing " + "\"" + "Inbox" + "\"" + " folder started.");
        Outlook.Items folderItemsInbox = null;
        folderItemsInbox = OutlookMethods.currentOAppNameSpace.Stores[JSONMethods.ReadAddInSetting().AddInPreferredMailBoxStoreName].GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).Items;

        if (folderItemsInbox.Count > 0)
        {
            for (int i = 1; i <= folderItemsInbox.Count; i++)
            {
                totalProcessedInboxMailItems++;
                if (GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.IsCancellationRequested)
                {
                    GlobalEnvironmentMethods.globalProcessingRemovingVisualIndicationTaskState = false;
                    GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.Dispose();
                    GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken = null;
                    GlobalEnvironmentMethods.ServiceProcedures.ReleaseComObject(new[] { folderItemsInbox });
                    totalProcessedInboxMailItems = 0;
                    NLogMethods.GetInstance().WriteWarnLog("[ADDITIONALVISUALINDICATIONSETTINGSFORM -> RUNREMOVEEXISTINGVISUALINDICATION()]: The task was cancelled by user.");

                    return;
                }
                else
                {
                    Outlook.MailItem mailItemObjectInbox = null;
                    mailItemObjectInbox = folderItemsInbox[i] as Outlook.MailItem;
                    if (mailItemObjectInbox != null)
                    {
                        if (mailItemObjectInbox.Class == Outlook.OlObjectClass.olMail)
                        {
                            bool mailItemChanged = false;
                            if (mailItemObjectInbox.Categories != null)
                            {
                                if (mailItemObjectInbox.Categories.Contains(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToLower()) || mailItemObjectInbox.Categories.Contains(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToUpper()))
                                {
                                    //When mail item has many categories, our need remove from string only our "CRM" category, other categories, include char "," will be applied correctly by Outlook automatically;
                                    //i.e. if mail item has 3 cat.: Green category, CRM, Yellow category -> after removing "CRM" cat. category text was: Green category, , Yellow category, but don't worry, Outlook will apply this string absolutely correctly;
                                    //Note: Mail item categories is case sensitive;
                                    mailItemChanged = true;
                                    if (mailItemObjectInbox.Categories.Contains(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToLower()))
                                    {
                                        mailItemObjectInbox.Categories = mailItemObjectInbox.Categories.Remove(mailItemObjectInbox.Categories.IndexOf(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToLower()), AddInEnvironmentMethods.CRM_CATEGORY_NAME.Length);
                                    }
                                    else if (mailItemObjectInbox.Categories.Contains(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToUpper()))
                                    {
                                        mailItemObjectInbox.Categories = mailItemObjectInbox.Categories.Remove(mailItemObjectInbox.Categories.IndexOf(AddInEnvironmentMethods.CRM_CATEGORY_NAME.ToUpper()), AddInEnvironmentMethods.CRM_CATEGORY_NAME.Length);
                                    }
                                }
                            }

                            if (mailItemObjectInbox.UserProperties.Find(AddInEnvironmentMethods.CRM_COLUMN_NAME) != null)
                            {
                                mailItemChanged = true;
                                mailItemObjectInbox.UserProperties.Find(AddInEnvironmentMethods.CRM_COLUMN_NAME).Delete();
                            }

                            if (mailItemChanged)
                            {

                                mailItemObjectInbox.Save();
                            }

                            GlobalEnvironmentMethods.ServiceProcedures.ReleaseComObject(new[] { mailItemObjectInbox });
                        }
                        else
                        {
                            GlobalEnvironmentMethods.ServiceProcedures.ReleaseComObject(new[] { mailItemObjectInbox });
                        }
                    }
                }
            }
        }
        else
        {
            GlobalEnvironmentMethods.ServiceProcedures.ReleaseComObject(new[] { folderItemsInbox });
        }

        GlobalEnvironmentMethods.globalProcessingRemovingVisualIndicationTaskState = false;
        GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken.Dispose();
        GlobalEnvironmentMethods.removeExistingVisualIndicationFromInboxFolderCancellationToken = null;
        NLogMethods.GetInstance().WriteInfoLog("[ADDITIONALVISUALINDICATIONSETTINGSFORM -> RUNREMOVEEXISTINGVISUALINDICATION()]: Processing " + "\"" + "Inbox" + "\"" + " folder completed.");
    }

Количество обработанных почтовых отправлений в папке «Входящие» = 988 элементов.Но иногда эта функция отлавливает исключение «Недостаточно памяти».Я не понимаю, почему это происходит ...

Примечание. В этой строке кода произошло исключение:

if (mailItemObjectInbox.Categories != null) //Out of memory ex...

Что я делаю неправильно?Спасибо

...