Saya agak bingung tentang cara mengelola SmtpClient sekarang karena dapat dibuang, terutama jika saya melakukan panggilan menggunakan SendAsync. Agaknya saya tidak harus memanggil Buang sampai SendAsync selesai. Tapi haruskah saya menyebutnya (misalnya, menggunakan "menggunakan"). Skenario ini adalah layanan WCF yang mengirimkan email secara berkala saat panggilan dibuat. Sebagian besar penghitungannya cepat, tetapi pengiriman email bisa memakan waktu beberapa detik atau lebih, jadi Async lebih disukai.
Apakah saya harus membuat SmtpClient baru setiap kali saya mengirim email? Haruskah saya membuatnya untuk seluruh WCF? Tolong!
Perbarui Jika ada perbedaan, setiap email selalu disesuaikan untuk pengguna. WCF dihosting di Azure dan Gmail digunakan sebagai pengirim surat.
sumber
Jawaban:
Catatan: .NET 4.5 SmtpClient mengimplementasikan
async awaitable
metodeSendMailAsync
. Untuk versi yang lebih rendah, gunakanSendAsync
seperti yang dijelaskan di bawah ini.Anda harus selalu membuang
IDisposable
contoh sedini mungkin. Dalam kasus panggilan async, ini adalah panggilan balik setelah pesan dikirim.Agak menjengkelkan karena
SendAsync
tidak menerima panggilan balik.sumber
await
tersedia. Ini adalah panggilan balik tradisional menggunakan penangan kejadian.await
harus digunakan jika menggunakan yang lebih baruSendMailAsync
.null
sebagai parameter keduaSendAsync(...)
?Pertanyaan asli ditanyakan tentang .NET 4, tetapi jika membantu sejak .NET 4.5 SmtpClient mengimplementasikan metode async yang dapat menunggu
SendMailAsync
.Akibatnya, untuk mengirim email secara asinkron adalah sebagai berikut:
Lebih baik hindari menggunakan metode SendAsync.
sumber
MailMessage
juga harus dibuang.Secara umum, benda IDisposable harus dibuang secepatnya; mengimplementasikan IDisposable pada sebuah objek dimaksudkan untuk mengkomunikasikan fakta bahwa kelas tersebut memiliki sumber daya mahal yang harus dilepaskan secara deterministik. Namun, jika membuat sumber daya itu mahal dan Anda perlu membuat banyak objek ini, mungkin lebih baik (secara performa) menyimpan satu instance dalam memori dan menggunakannya kembali. Hanya ada satu cara untuk mengetahui apakah itu membuat perbedaan: buat profil!
Re: membuang dan Async: Anda tidak dapat menggunakan dengan
using
jelas. Sebagai gantinya Anda biasanya membuang objek di acara SendCompleted:sumber
Oke, pertanyaan lama saya tahu. Tetapi saya menemukan ini sendiri ketika saya perlu menerapkan sesuatu yang serupa. Saya hanya ingin membagikan beberapa kode.
Saya mengulangi beberapa SmtpClients untuk mengirim beberapa email secara asynchronous. Solusi saya mirip dengan TheCodeKing, tetapi saya membuang objek callback sebagai gantinya. Saya juga meneruskan MailMessage sebagai userToken untuk mendapatkannya di acara SendCompleted sehingga saya juga dapat memanggil buang di situ. Seperti ini:
sumber
4.3.2 The maximum number of concurrent connections has exceeded a limit, closing trasmission channel
. Alih-alih, coba gunakan hanya satu contohSmtpClient
Anda dapat melihat mengapa sangat penting untuk membuang SmtpClient dengan komentar berikut:
Dalam skenario saya mengirim banyak email menggunakan Gmail tanpa membuang klien, saya biasa mendapatkan:
sumber