Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.1 ) |
- 日時: 2012/08/06 07:46
- 名前: Toki◆pRU.c9X.EOI
- メールの非同期送信は以下のコードを参考にしてください
TKMP.Writer.MailWriter mail = new TKMP.Writer.MailWriter(); TKMP.Net.SmtpClient client = new TKMP.Net.SmtpClient(host, port); 定義と接続は省略 System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(delegate { client.SendMail(mail); })); thread.Start();
メール受信にのみ非同期命令を実装しているのは、処理時間の問題ではなく 非同期処理キューが多数ある状態でも同期処理を割り込んで実行できるようにするためです。 POP接続ではメール受信以外にもメールの削除などを行うことがあるので、 非同期受信中に目的のメールの操作を同期で処理するために実装してあります。
これに対し、SMTPでは送信処理以外に命令がないので、 ライブラリ側での実装は意味がないと判断しています。
|
Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.2 ) |
- 日時: 2012/08/12 18:09
- 名前: cdg
- 返事をありがとうございます。
なるほど、送信処理の非同期処理をライブラリに入れてない理由も判りました。
それと、サンプルプログラム、ありがとうございます。 さくっと、これが書けるのなら問題無いのですが・・・助かりました。m(__)m
これからも、よろしくお願いします。
|
Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.3 ) |
- 日時: 2012/08/12 18:36
- 名前: cdg
- さっそく、試してみましたが・・・
「サーバーからのレスポンスがありませんでした。\r\n通信はタイムアウトしました。」というエラーが発生します。
以下のコードは、別スレッドにしない状態で正常にメール送信できているソースです。
コメントアウトしている部分が、別スレッドによる送信とした部分です。
別ThreadでのTimeOutで色々と検索してみましたが、イマイチ、参考となる所が無かったので、再度、教えて頂けると助かります。m(__)m
// サーバーへ接続 if (smtp.Connect()) { //System.Threading.Thread thread = // new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(delegate{ smtp.SendMail(mr);})); //thread.Start(); smtp.SendMail(mr); smtp.Close(); } else { throw new Exception("smtpサーバーへ接続出来ません。"); }
|
Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.4 ) |
- 日時: 2012/08/12 23:33
- 名前: Toki◆pRU.c9X.EOI
- サンプルの書き方が悪かったようですね。
たぶん、別スレッドの通信開始前にCloseメソッドが実行されてしまっているのではないでしょうか
別スレッドのdelegate内でsmtp.close()を実行してはどうでしょうか?
|
Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.5 ) |
- 日時: 2013/10/10 17:10
- 名前: cdg
- 大変、遅くなりました。
結局、別スレッドで動作させる事は可能になりましたが、送信結果により再送が必要か?などの処理が必要ですので、元のコードに戻してます。^_^;
どなたかの参考になれば・・・と思いますので、成功したコードを載せておきます。
ちなみに、時間がかかってるのはSendMailよりConnectの方でしたので、Connectまで別スレッドにしてます。
※スペースが削除されるので、全角スペースを使ってます。・・・注意して下さい。
bool bResult = false; System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(delegate { if (smtp.Connect()) { smtp.SendMail(mr); smtp.Close(); bResult = true; } else { bResult = false; } } )); thread.Start(); // thread.Join(); //これをコメントアウトすると・・・待ち時間は同じ^_^;
// これ以下の処理は、Join()を使わないと有効ではありません。 if (bResult) { return true; } else { log("smtpサーバーへ接続出来ません。"); return false; }
これを、きちんと動作するように作るなら、別スレッド用に送信成功時、失敗時のイベントを持ったクラスを作るしか無いと思われます。
メール送信中の操作ブロック・・・バグったか?と勘違いするので、焦りますね^^;
自分でクラスを作るという方法も考えましたが、TKMPに送信に関するAsync命令が実装されるのを待つ事にしました。m(__)m
|