2013-01-25 46 views
5

Tôi đã phát triển một ứng dụng chủ yếu gửi thư email sử dụng SMTP. Gửi tin nhắn từng người một là tốt, tuy nhiên tôi đang tìm cách để tăng tốc quá trình. Tôi đã tạo nhiều phiên bản của SmtpClient cũng như các thư để tránh xung đột lẫn nhau. Bởi vì các trường hợp riêng biệt, tôi giả định thực hiện .Send() trên nhiều luồng sẽ hoạt động tốt. Tuy nhiên, một cái gì đó với mã số Thread của tôi không hoạt động, bởi vì tôi không thể gửi ngay cả một email trên một chuỗi bằng cách sử dụng mã này. Tôi chỉ nhận được một ngoại lệ "Failure sending mail" mơ hồ. Tôi sẽ đăng mã hoạt động và Thread không hoạt động. Ai đó có thể chia sẻ điều họ tin có thể là nguyên nhân?C# Gửi SMTP bằng System.Threading

Note Tôi hiện không muốn sử dụng các async khả năng mới hơn nhưng thay vì tận dụng Thread

Tuyên bố làm việc và phương pháp Call:

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); 
    } 

KHÔNG Làm việc khai Chủ đề và Phương pháp Call:

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

Bạn có 'Thread' mới bên trong một 'khối using' cho' message'? Bằng cách này, tin nhắn có thể được xử lý trước khi chủ đề mới gửi nó. –

+0

Vứt tờ khai và phương pháp làm việc của bạn theo phương pháp khác và sau đó sử dụng phương pháp đó trong chủ đề – nsconnector

+0

Tôi thì không. Bạn có thể giải thích thêm một chút được không? Tôi cũng không chắc chắn những gì bạn có nghĩa là bằng cách được xử lý trước khi các chủ đề mới gửi nó, để thử nghiệm vì lợi ích tôi chỉ sử dụng một sợi. Tôi cũng có thể là con đường ở đây, tôi hy vọng bạn có thể trần với tôi. – scniro

Trả lời

11

quyết:

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

@nsconnector nếu ngoại lệ xảy ra trong Chủ đề mới (...), T1.Bắt đầu() sẽ bắt đầu hoặc ném một ngoại lệ? –

+0

*** xử lý lỗi ***? –

1

Tại sao không chỉ cần sử dụng các phương pháp Smtp.SendAsync?

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

+4

Bởi vì SendAsync vẫn chặn chuỗi giao diện người dùng và đôi khi bạn không muốn người dùng phải đợi trên đó. Vì vậy, bạn gửi chúng trên một chủ đề nền. –

+0

@BradBamford giải pháp và mẫu mã tốt hơn mà không có *** SendAsync ***? –

2

Bạn có thể làm điều đó dễ dàng hơn bằng cách định nghĩa tất cả mọi thứ trước và chỉ kêu gọi các chủ đề mới.

//define everything above 

Thread t1 = new Thread(delegate() 
{ 

    SMTP.send(message); 

}); 

t1.Start(); 

Thats những gì tôi đã làm và nó làm cho cuộc sống dễ dàng hơn với những dấu ngoặc nhọn

Các vấn đề liên quan