2013-01-25 20 views
5

Opracowałem aplikację, która głównie wysyła wiadomości e-mail za pomocą protokołu SMTP. Wysyłanie wiadomości jeden po drugim jest w porządku, jednak staram się przyspieszyć ten proces. Stworzyłem wiele wystąpień SmtpClient, a także wiadomości, aby uniknąć konfliktu między sobą. Z powodu osobnych instancji założyłem, że wykonanie .Send() na wielu wątkach będzie działało dobrze. Jednak coś z moim kodem Thread nie działa, ponieważ nie mogę wysłać nawet jednego e-maila w jednym wątku, używając tego kodu. Po prostu otrzymuję niejasny wyjątek "Failure sending mail". Opublikuję kod, który działa, a nie działa Thread. Czy ktoś może podzielić się tym, co może być przyczyną?C# Wysyłanie SMTP przy użyciu System.Threading

Uwaga Nie jestem obecnie poszukuje do korzystania z nowszych async możliwości lecz wykorzystując Thread

Deklaracja roboczy i sposób połączenia:

var SMTP = new SmtpClient 
    { 
     Host = txtBxSenderHost.Text, 
     Port = 587, 
     EnableSsl = true, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = false, 
     Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
    }; 

using (var message = new MailMessage(senderAdrress, toAddress) 
    { 
     Subject = strSubject, 
     Body = strBody 
    }) 

    { 
     SMTP.Send(message); 
    } 

nie działa deklaracja Temat i sposób połączenia:

var SMTP = new SmtpClient 
    { 
     Host = txtBxSenderHost.Text, 
     Port = 587, 
     EnableSsl = true, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = false, 
     Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
    }; 

using (var message = new MailMessage(senderAdrress, toAddress) 
    { 
     Subject = strSubject, 
     Body = strBody 
    }) 

    { 
     Thread T1 = new Thread(delegate() { SMTP.Send(message); }); 
     T1.Start(); 
    } 
+0

Czy masz nowy Thread' '' using' wewnątrz bloku 'message'? W ten sposób wiadomość zostanie prawdopodobnie usunięta przed wysłaniem nowego wątku. –

+0

Zawiń deklarację roboczą i metodę pracy w innej metodzie, a następnie użyj tej metody w wątku – nsconnector

+0

. Nie. Czy możesz rozwinąć nieco więcej, proszę? Nie jestem także pewien, co masz na myśli, mówiąc, że zostałeś usunięty przed wysłaniem nowej nici, dla sprawdzenia, czy używam tylko jednego wątku. Mógłbym też być daleko stąd, mam nadzieję, że możesz mnie uratować. – scniro

Odpowiedz

11

rozwiązany:

var SMTP = new SmtpClient 
     { 
      Host = txtBxSenderHost.Text, 
      Port = 587, 
      EnableSsl = true, 
      DeliveryMethod = SmtpDeliveryMethod.Network, 
      UseDefaultCredentials = false, 
      Credentials = new NetworkCredential(strSenderAddress, strSenderPassword) 
     }; 

     Thread T1 = new Thread(delegate() 
     { 
      using (var message = new MailMessage(senderAdrress, toAddress) 
      { 
       Subject = strSubject, 
       Body = strBody 
      }) 
      { 
       { 
        SMTP.Send(message); 
       } 
      } 
     }); 

     T1.Start(); 
+0

@nłącze, co jeśli wyjątek wystąpi w nowym wątku (...), T1.Start() rozpocznie lub wyrzuci wyjątek? –

+0

*** obsługa błędów ***? –

1

Dlaczego nie wystarczy użyć metody Smtp.SendAsync?

http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

+4

Ponieważ SendAsync nadal blokuje wątek interfejsu użytkownika, a czasami nie chcesz, aby użytkownik musiał na niego czekać. Więc wyślesz je na tle wątku. –

+0

@BradBamford lepsze rozwiązanie i przykład kodu bez *** SendAsync ***? –

2

Można zrobić jeszcze łatwiej definiując wszystko wcześniej i po prostu wywołanie nowy wątek.

//define everything above 

Thread t1 = new Thread(delegate() 
{ 

    SMTP.send(message); 

}); 

t1.Start(); 

To jest to co zrobiłem i to ułatwia życie z tymi klamrami

Powiązane problemy