Just nu i M3-nätverket
Gå till innehåll

Trådproblem


Rest man Klaymen

Rekommendera Poster

Rest man Klaymen

Hej!

 

Jag har en tråd som startar vid Application_start och dör vid Application_end. Det den ska göra är att kolla i en kö med e-mail som ska skickas. När en användare använder en "skicka mail"-funktion läggs meddelandet (inklusive avsändare och mottagare) in i kön och bör på så sätt fångas upp av tråden. På ett ställe i applikationen läggs flera tusen mail in i kön. Jag har också en sida där jag kan se hur stor kön är.

 

Problemet är att tråden bara rullar ca 20 varv innan hela applikationen dör och kön töms. Jag kan se på sidan att köns storlek minskar, men efter någon minut förfaller alla sessioner och köns längd blir 0.

 

Här är koden:

private static void ProcessQueue()
       {
           bool processing = false;

           SmtpClient client = new SmtpClient("localhost", 25);


           while (true)
           {

//om kön är tom ska den vänta 10s
               if (_messages.Count > 0)
               {

//töm felmeddelandena om kön precis fyllts
                   if (!processing)
                   {
                       _error = "";
                       processing = true;
                   }

//hämta mail från kön _messages
                   MailMessage m;
                   lock (_messages)
                   {
                       m = _messages.Dequeue();
                   }

//kod som förbereder mail
                   System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();

                   mail.IsBodyHtml = true;
                   mail.BodyEncoding = Encoding.UTF8;
                   mail.Headers.Add("Return-Path", "<bounce@3tjejer.se>");

                   mail.From = new MailAddress(m.SenderEmail);
                   mail.To.Add(new MailAddress(m.RecipientEmail));
                   mail.Subject = m.Subject;

                   mail.Body = "<html>\n<head>\n</head>\n<body>\n";

                   mail.Body += "<div style=\"width:500px;border:1px solid black;padding:25px;\">\n";
                   mail.Body += m.Body + "</div>\n</body>\n</html>";
//mail förberett



                   /*
                   try
                   {

                       client.Send(mail);

                   }
                   catch(Exception ex)
                   {
                       _error += m.RecipientEmail + "=" + ex.Message + ", ";
                   }

                   */

                   mail.Dispose();


                   //wait before sending the next mail
                   Thread.Sleep(1000);
               }
               else
               {
                   processing = false;

                   //if queue is empty, wait 10 seconds before checking again
                   Thread.Sleep(10000);
               }

           }

       }

 

Kommenterar jag bort koden som förbereder mailet så fungerar det bättre. Kan det vara en minnesläcka någonstans? Som ni ser har jag kommenterat bort själva skickningen av mailet, men det fungerar ändå inte. Någon som ser vad som kan vara fel?

Länk till kommentar
Dela på andra webbplatser

Är du helt säker på att en tråd är bästa lösningen? Jag misstänker att ett batchjob är en stabilare lösning.

 

Spara ned informationen om breven i en fil eller i en tabell och låt ett batchjob skicka breven med någon minuts intervall. Jag tror det kommer fungera bättre.

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Till saken hör att siten är hostad i en shared environment där jag inte har möjlighet att köra några services eller batchprogram. Tråd är förstås ändå inte den enda möjligheten men den kändes enklast.

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

Kommenterar jag bort raden

 

mail.To.Add(new MailAddress(m.RecipientEmail));

 

så rullar tråden vidare, men med den raden kvar startar applikationen om efter ca 20 varv. Finns det en bugg eller använder jag denna metod fel? Den kanske inte är trådsäker?

Länk till kommentar
Dela på andra webbplatser

Rest man Klaymen

AH, jag tror jag hittat felet. Det hade inget med trådar att göra. Det var bara för att jag gick ifrån System.Web.Mail till System.Net.Mail utan att inse att MailAddress kastar en exception om adressen är ogiltig. En exception som jag inte fångade eftersom min förra kod bara petade in en string med adresser.

 

SÅ: en try-catche runt mail.To.Add() fixade biffen!

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...