ThreadPool和内存(BTStackServer)异常 - .NET

时间:2012-03-13 20:46:06

标签: asp.net .net multithreading .net-4.0 threadpool

继续我的problem here,我创建了一个使用ThreadPool个帖子发送电子邮件的测试应用。这是我正在使用的代码。

        protected void btnSend_Click(object sender, EventArgs e)
        {
            EmailInfo em = new EmailInfo { Body = "Test", FromEmail = "test@test.com", Subject = "Test Email", To = "test@test.com" };
//txtNumEmails is a textbox where I can enter number of emails to send
            for (int i = 0; i < Convert.ToInt32(this.txtNumEmails.Text); i++)
            {
                bool bResult = ThreadPool.QueueUserWorkItem(new WaitCallback(EmailNow), em);
            }

        }


        public void EmailNow(object emailInfo) // Email Info object
        {
            EmailInfo em = emailInfo as EmailInfo;

            SmtpClient client = new SmtpClient("localhost");
            client.UseDefaultCredentials = true; 

            client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
            client.PickupDirectoryLocation = @"C:\temp\testemails\";

            MailMessage m = new MailMessage();
            m.To.Add(new MailAddress(em.To));
            m.Body = em.Body;
            m.IsBodyHtml = false;
            m.From = new MailAddress(em.FromEmail);
            m.Subject = em.Subject;

            client.Send(m);
        }

对于较小的数字(10k,50k),它们工作得很好,但是一旦我将数字增加到200k(这是我的目标),我就得到了这个例外:

enter image description here

它在抛出此异常之前创建了大约186k封电子邮件。

我假设这不是由于磁盘空间不足引起的异常(因为我在C:\temp\testemails本地存储了所有电子邮件,但因为它的RAM(?)很低。正如{{{ 3}},我使用信号量将它们限制为10k,但仍然遇到了同样的问题。这是带信号量的信号的代码。

    protected void Button1_Click(object sender, EventArgs e)
    {
        EmailInfo em = new EmailInfo { Body = "Test", FromEmail = "test@test.com", Subject = "Test Email", To = "test@test.com" };
        var semaphore = new SemaphoreSlim(10000, 10000);

        for (int i = 0; i < Convert.ToInt32(this.txtNumEmails.Text); i++)
        {
            semaphore.Wait();
            bool bResult = ThreadPool.QueueUserWorkItem( (state) => { 
                try 
                {           
                    EmailNow(em);
                }
                catch (Exception)
                {

                    throw;
                }
                finally
                {
                             semaphore.Release();
                }
            },  null);
        }
    }

这个也引发了一个例外,但我看到该文件夹​​中的所有200k电子邮件。如果发生此异常,我绝对可以使用try catch并优雅地退出,但我如何防止这种情况发生。

2 个答案:

答案 0 :(得分:1)

尝试通过使用块包装内部或显式调用dispose()来处理SmtpClient对象。

答案 1 :(得分:0)

尝试将SemaphoreSlim构造函数的10000减少到1000。