1

以下のコードは 10 回中 9 回は機能しますが、場合によっては次のエラーが表示されます: サーバー管理者が、同時に開くことができるアイテムの数を制限しています。開いたメッセージを閉じるか、作成中の未送信メッセージから添付ファイルや画像を削除してみてください。

プルしようとしているメールを確認しましたが、それらはすべて通常のメッセージです。打ち合わせなどはありません。私はその種の電子メールのいくつかをきれいにしました。

        Microsoft.Office.Interop.Outlook.Application myApp = new Microsoft.Office.Interop.Outlook.Application();

        NameSpace mapiNameSpace = myApp.GetNamespace("MAPI");
        MAPIFolder myInbox = mapiNameSpace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

        var mail = myInbox.Items;

        foreach (object items in mail)
        {
            var item = items as MailItem;
            if (item != null)
            {

            if (!senderEmail.Equals(String.Empty) && senderName.Equals(String.Empty) && emailSubject.Equals(String.Empty))
            {
               try
                    {
                        if (((MailItem)item).SenderEmailAddress.ToLower().Contains(senderEmail.ToLower()))
                        {
                            if (count <= 40)
                            {
                                if (((MailItem)item).SenderEmailAddress.Contains(""))
                                {
                                    var senderEmailAddress = ((MailItem)item).SenderEmailAddress.Remove(((MailItem)item).SenderEmailAddress.IndexOf(""), 32);
                                    resultsGrid.Rows.Add(count, ((MailItem)item).Subject, ((MailItem)item).SenderName, senderEmailAddress, ((MailItem)item).CreationTime.ToString());
                                    resultsGrid.AutoResizeColumns();
                                }
                                else if (((MailItem)item).SenderEmailAddress.Contains(""))
                                {
                                    var senderEmailAddress = ((MailItem)item).SenderEmailAddress.Remove(((MailItem)item).SenderEmailAddress.IndexOf(""), 75);
                                    resultsGrid.Rows.Add(count, ((MailItem)item).Subject, ((MailItem)item).SenderName, senderEmailAddress, ((MailItem)item).CreationTime.ToString());
                                    resultsGrid.AutoResizeColumns();
                                }
                                else
                                {
                                    resultsGrid.Rows.Add(count, ((MailItem)item).Subject, ((MailItem)item).SenderName, ((MailItem)item).SenderEmailAddress, ((MailItem)item).CreationTime.ToString());
                                    resultsGrid.AutoResizeColumns();
                                }

                                count++;
                            }
                            else
                            {
                                resultsGrid.Rows.Add(String.Empty, "Total items in      Mailbox: " + myInbox.Items.Count, String.Empty, String.Empty, String.Empty);
                                break;
                            }
                        }
                    }
                    catch (COMException e)
                    {
                        resultsGrid.Rows.Add(e.Message);
                        resultsGrid.AutoResizeColumns();
                        break;
                    }
                    continue;
                }
     }
4

1 に答える 1

0

GC.Collect() を使用して、プログラムに Outlook への以前のオブジェクト/呼び出しを強制的にクリーンアップさせることができました。

GC.Collect() を呼び出すのが最善のアイデアではないことはわかっていますが、ここに示す基準に適合していると思います: http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx

問題は、私が多くの異なる電子メールを開くための多くの要求を生成していることであり、ガベージ コレクションは通常ランダムに発生し、十分な速度で発生しないため、制限に達するまでにガベージ コレクションが必要になることです。問題は、私がそうする前にそれが起こっていないことです.GC.Collect()を頻繁に呼び出して、開いているオブジェクトを確実にリセットする必要があります.

于 2013-11-06T19:21:22.900 に答える