22

SmtpClient を使用して .NET で (完全に正当なスパム以外の目的で) 通知サービスを作成しようとしています。最初は各メッセージをループして送信しましたが、これは遅いため、速度を改善したいと考えています。そのため、「SendAsync」の使用に切り替えましたが、2 回目の呼び出しで次のエラーが発生しました。

An asynchronous call is already in progress. 

私はこれを読んで、MS が System.Net.Mail を無効にして、大量のメーラーを防いだことを意味していると解釈しました。これは正しいです?もしそうなら、.NET でこれを行うためのより良い方法はありますか?それでも各電子メールの結果をログに記録できます (これはクライアントにとって重要です)。そうでない場合、SendAsync を 1 回しか呼び出せないのはなぜですか?

4

7 に答える 7

35

ドキュメントによると:

SendAsync を呼び出した後、Send または SendAsync を使用して別の電子メール メッセージを送信する前に、電子メールの送信が完了するまで待つ必要があります。

したがって、同時に複数のメールを送信するには、複数の SmtpClient インスタンスが必要です。

于 2008-12-23T18:43:15.683 に答える
6

以下を使用できる場合があります。

ThreadPool.QueueUserWorkItem(state => client.Send(msg));

これにより、メッセージをキューに入れ、スレッドが利用可能になったときに送信できるようになります。

于 2009-09-01T19:54:51.953 に答える
4

XXXAsyncメソッドのクラスを誤解していると思います。これらの非同期呼び出しの目的は、メソッドが処理を終了して最初に戻る必要なく、プログラムの実行を継続できるようにすることです。XXXReceivedオブジェクトのイベントのようなものにサブスクライブすることで、後で結果を処理できます。

複数のメールを同時に送信するには、複数Threadの を使用することを検討してください。

于 2008-12-23T18:46:31.387 に答える
4

明らかに、これは大量のメーラーを止める試みではありません。

その理由は、SmtpClient クラスがスレッド セーフではないためです。複数の電子メールを同時に送信する場合は、いくつかのワーカー スレッドを生成し (.NET Framework でそれを行う方法がいくつかあります)、それぞれに SmtpClient の個別のインスタンスを作成する必要があります。

于 2008-12-23T18:42:27.853 に答える
2

ここにいる他の全員が気付いているように、一度に 1 つの電子メールしか送信できませんが、最初の電子メールが送信された後に別の電子メールを送信する方法は、SmtpClient クラスの .SendCompleted イベントを処理し、次に次の電子メールに移動して、それを送ってください。

多くの電子メールを同時に送信したい場合は、他の人が言ったように、複数の SmtpClient オブジェクトを使用してください。

于 2008-12-23T18:52:16.757 に答える
2

SMTP クライアントごとに一度に 1 つだけ送信できます。複数の send 呼び出しを行う場合は、複数の SMTP クライアントを作成します。

HTH、

コルビー・アフリカ

于 2008-12-23T18:43:39.130 に答える