生成大量byte []对象时C#中的System.OutOfMemoryException

时间:2018-06-01 16:19:00

标签: c# asp.net .net out-of-memory

我正在使用此代码修改pdf tmeplate以向其添加特定详细信息,

private static byte[] GeneratePdfFromPdfFile(byte[] file, string landingPage, string code)
        {

            try
            {

                using (var ms = new MemoryStream())
                {
                    using (var reader = new PdfReader(file))
                    {
                        using (var stamper = new PdfStamper(reader, ms))
                        {
                            string _embeddedURL = "http://" + landingPage + "/Default.aspx?code=" + code + "&m=" + eventCode18;
                            PdfAction act = new PdfAction(_embeddedURL);
                            stamper.Writer.SetOpenAction(act);
                            stamper.Close();
                            reader.Close();
                            return ms.ToArray();
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                File.WriteAllText(HttpRuntime.AppDomainAppPath + @"AttachmentException.txt", ex.Message + ex.StackTrace);
                return null;
            }
        }

从此方法调用此方法:

 public static byte[] GenerateAttachment(AttachmentExtenstion type, string Contents, string FileName, string code, string landingPage, bool zipped, byte[] File = null)
        {
            byte[] finalVal = null;
            try
            {
                switch (type)
                {
                    case AttachmentExtenstion.PDF:
                        finalVal = GeneratePdfFromPdfFile(File, landingPage, code);
                        break;
                    case AttachmentExtenstion.WordX:
                    case AttachmentExtenstion.Word:
                        finalVal = GenerateWordFromDocFile(File, code, landingPage);
                        break;
                    case AttachmentExtenstion.HTML:
                        finalVal = GenerateHtmlFile(Contents, code, landingPage);
                        break;
                }
                return zipped ? _getZippedFile(finalVal, FileName) : finalVal;
            }
            catch(Exception ex)
            {
                return null;
            }
        }

这是主要的来电者,

 foreach (var item in Recipients)
                {
//...
//....
 item.EmailAttachment = AttachmentGeneratorEngine.GenerateAttachment(_type, "", item.AttachmentName, item.CMPRCode, _cmpTmp.LandingDomain, _cmpTmp.AttachmentZip.Value, _cmpTmp.getFirstAttachment(item.Language, item.DefaultLanguage));
}

正在调用 AttachmentGeneratorEngine.GenerateAttachment 方法。 4k次,因为我正在为我的List中的每个元素添加PDF模板中的特定PDF文件。

最近我开始有这个例外:

Exception of type 'System.OutOfMemoryException' was thrown.   at System.IO.MemoryStream.ToArray()

我已经在课程中实现了IDisposible,并确保所有这些都被释放。

注意:它在非常平滑之前运行,并且我还仔细检查了系统的资源 - 在16 GB中使用了9 GB,因此我有足够的可用内存。

==========================================

更新: 这是循环遍历列表的代码

  public static bool ProcessGroupLaunch(string groupCode, int customerId, string UilangCode)
        {
            CampaignGroup cmpGList = GetCampaignGroup(groupCode, customerId, UilangCode)[0];
            _campaigns = GetCampaigns(groupCode, customerId);
            List<CampaignRecipientLib> Recipients = GetGroupRcipientsToLaunch(cmpGList.ID, customerId);
            try
            {
                foreach (var item in _campaigns)
                    item.Details = GetCampaignDetails(item.CampaignId.Value, UilangCode);

                Stopwatch stopWatch = new Stopwatch();

                #region single-threaded ForEach

                foreach (var item in Recipients)
                {
                    CampaignLib _cmpTmp = _campaigns.FirstOrDefault(x => x.CampaignId.Value == item.CampaignId);
                    bool IncludeAttachment = _cmpTmp.IncludeAttachment ?? false;
                    bool IncludeAttachmentDoubleBarrel = _cmpTmp.IncludeAttachmentDoubleBarrel ?? false;

                    if (IncludeAttachment)
                    {
                        if (_cmpTmp.AttachmentExtension.ToLower().Equals("doc") || (_cmpTmp.AttachmentExtension.ToLower().Equals("docx")))
                            _type = AttachmentGeneratorEngine.AttachmentExtenstion.Word;
                        else if (_cmpTmp.AttachmentExtension.ToLower().Equals("ppt") || (_cmpTmp.AttachmentExtension.ToLower().Equals("pptx")))
                            _type = AttachmentGeneratorEngine.AttachmentExtenstion.PowePoint;
                        else if (_cmpTmp.AttachmentExtension.ToLower().Equals("xls") || (_cmpTmp.AttachmentExtension.ToLower().Equals("xlsx")))
                            _type = AttachmentGeneratorEngine.AttachmentExtenstion.Excel;
                        else if (_cmpTmp.AttachmentExtension.ToLower().Equals("pdf"))
                            _type = AttachmentGeneratorEngine.AttachmentExtenstion.PDF;
                        else if (_cmpTmp.AttachmentExtension.ToLower().Equals("html"))
                            _type = AttachmentGeneratorEngine.AttachmentExtenstion.HTML;
                    }


                        //set "recpient" details
                        item.EmailFrom = _cmpTmp.EmailFromPrefix + "@" + _cmpTmp.EmailFromDomain;
                        item.EmailBody = GetChangedPlaceHolders((_cmpTmp.getBodybyLangCode(string.IsNullOrEmpty(item.Language) ? item.DefaultLanguage : item.Language, item.DefaultLanguage)), item.ID, _cmpTmp.CustomerId.Value, _cmpTmp.CampaignId.Value);

                        if (item.EmailBody.Contains("[T-LandingPageLink]"))
                        {
                           //..
                        }

                        if (item.EmailBody.Contains("[T-FeedbackLink]"))
                        {
                           //..
                        }

                        if (item.EmailBody.Contains("src=\".."))
                        {
                            //..
                        }


                        //set flags to be used by the SMTP Queue and Scheduler
                        item.ReadyTobeSent = true;
                        item.PickupReady = false;


                        //add attachment to the recipient, if any.
                        if (IncludeAttachment)
                        {
                            item.AttachmentName = _cmpTmp.getAttachmentSubjectbyLangCode(string.IsNullOrEmpty(item.Language) ? item.DefaultLanguage : item.Language, item.DefaultLanguage) + "." + _cmpTmp.AttachmentExtension.ToLower();


                            try
                            {
                                if (_type == AttachmentGeneratorEngine.AttachmentExtenstion.PDF || _type == AttachmentGeneratorEngine.AttachmentExtenstion.WordX || _type == AttachmentGeneratorEngine.AttachmentExtenstion.Word)
                                    item.EmailAttachment = AttachmentGeneratorEngine.GenerateAttachment(_type, "", item.AttachmentName, item.CMPRCode, _cmpTmp.LandingDomain, _cmpTmp.AttachmentZip.Value, _cmpTmp.getFirstAttachment(item.Language, item.DefaultLanguage));
                                else item.EmailAttachment = AttachmentGeneratorEngine.GenerateAttachment(_type, value, item.AttachmentName, item.CMPRCode, _cmpTmp.LandingDomain, _cmpTmp.AttachmentZip.Value);

                                item.AttachmentName = _cmpTmp.AttachmentZip.Value ? (_cmpTmp.getAttachmentSubjectbyLangCode(string.IsNullOrEmpty(item.Language) ? item.DefaultLanguage : item.Language, item.DefaultLanguage) + ".zip") :
                                                 _cmpTmp.getAttachmentSubjectbyLangCode(string.IsNullOrEmpty(item.Language) ? item.DefaultLanguage : item.Language, item.DefaultLanguage) + "." + _cmpTmp.AttachmentExtension.ToLower();
                            }
                            catch (Exception ex)
                            {

                            }

                        }
                        else
                        {
                            item.EmailAttachment = null;
                            item.AttachmentName = null;
                        }


                }
                #endregion

                stopWatch.Stop();
                bool res = WriteCampaignRecipientsLaunch(ref Recipients);
                return res;

            }
            catch (Exception ex)
            {
                Recipients.ForEach(i => i.Dispose());
                cmpGList.Dispose();

                Recipients = null;
                cmpGList = null;

                return false;
            }
            finally
            {
                Recipients.ForEach(i => i.Dispose());
                cmpGList.Dispose();

                Recipients = null;                
                cmpGList = null;

            }
        }

0 个答案:

没有答案