2013-01-25 9 views
5

私は主にSMTPを使用する電子メールメッセージを送信するアプリケーションを開発しました。メッセージを1つずつ送信するのは問題ありませんが、処理を迅速化することを検討しています。私はSmtpClientの複数のインスタンスと、互いに衝突しないようにするためのメッセージを作成しました。別々のインスタンスのため、私は複数のスレッド上で.Send()の実行がうまくいくと仮定しました。しかし、私のThreadコードだけのものは、このコードを使用して1つのスレッドで1つの電子メールを送信することはできないため、動作しません。私は単に曖昧な"Failure sending mail"の例外を受け取ります。私は動作するコードを投稿し、Threadは動作しません。誰かが原因と思われるものを共有することができますか?C#System.Threadingを使用してSMTPを送信する

は、私は現在、新しいasync機能を使用するために探してではなく、活用していないですThread

ワーキング宣言とメソッドコール:

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

機能していないスレッドの宣言とメソッドコール:

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

との生活が容易になりますか?この方法では、新しいスレッドがメッセージを送信する前にメッセージが破棄される可能性があります。 –

+0

作業宣言と作業メソッドを別のメソッドにラップし、そのメソッドをスレッド – nsconnector

+0

で使用します。もう少し詳しく教えてもらえますか?私はまた、新しいスレッドがそれを送信する前に、あなたが処理していることを意味しているのか確信しています。私はまたここから離れているかもしれません、私はあなたが私と一緒に裸になることを願っています。 – scniro

答えて

11

解決:

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新しいスレッド(...)、T1で例外が発生した場合はどうなりますか?Start()は例外を開始またはスローしますか? –

+0

***エラー処理***? –

1

理由だけではなく、Smtp.SendAsyncメソッドを使用していませんか?

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

+4

SendAsyncはUIスレッドをブロックしているため、ユーザーがそのスレッドを待機する必要がないことがあります。だからあなたはバックグラウンドスレッドでそれらを送信します。 –

+0

@BradBamford *** SendAsync ***のないより良いソリューションとコードサンプル? –

2

あなたは、事前にすべてを定義し、ちょうど新しいスレッドを呼び出すことにより、さらに簡単にそれを行うことができます。私が何をしたかザッツ

//define everything above 

Thread t1 = new Thread(delegate() 
{ 

    SMTP.send(message); 

}); 

t1.Start(); 

、それはあなたが `message`では` using`ブロックの内側 `新しいThread`を持っていますか、それらの中括弧

関連する問題