| Editor Login | Register | ||
| > Akademik İnternet ® > ASP.NET |
|
|
| ASP.NET ile Threading | |||
Açıklama: ASP.NET ile çoklu email gönderme uygulamasının Threading ile uygulanması. Thread bir programın bağımsız olarak çalıştırılan parçasına denir. .NET platformu ile çok thread li programlar yazabiliriz. Tabiki bu durum ASP.NET için de geçerli. ASP nin önceki versiyonlarında böyle bir imkan mevcut değildi. Örneğin makalemizin konusu olan çok fazla sayıda kişiye email göndermek için tüm kullanıcıları bir for döngüsüne alıp tek tek gönderme yaparken gönderilecek kişi sayısı artıkça işlemin alacağı sürede artar. Bu işi ASP3 gibi bir ortamda yapmak istersek asp sayfamız işlemlerin bitmesini bekleyemeden timeout olacak ve işlemimizde kesilecekti. ASP.NET cephesine bakarsak Threading desteği sayesinde bu iş kolaylaşıyor. Threading için yukarıda "bağımsız olarak çalıştırılan program kod parçası" deyimini kullanmıştık. İşte bu sayede email göndermek için gerekli olan kod parçasını (subroutione -sub-) uygulamanın ana threadinden ayrı olarak çalıştırıyoruz ve işlemin arkaplanda devam etmesini sağlıyoruz. .Net te multi thread programlama "System.Threading" namespace indeki "Thread" sınıfı kullanılarak yapılabilir. Thread sınıfının yapılandırıcısı (constructor) ayrı bir thread olarak çalıştırılacak olan prosedürün adresini parametre olarak alır. ASP.NET ile Threading kullanarak yazılmış olan bir projede 40-50 bin kişiye email gönderiyorum ve hiç bir sorun yaşamıyorum. İşte bu durumda "Neden ASP.NET?" diyenlere bir cevap daha vermiş olduk. :) Uygulamamıza geçelim ve asp.net ile threading yapmayı öğrenelim. Amacımız nedir? Çok sayıda kişiye email göndermek. Bu gönderim sırasında gönderim işleminin uzunluğu dolayısıyla sayfanın hızını kesmemek, işlemlerin arkaplanda yapılmaya devam etmesini sağlmak. Amacımız doğrultusunda Postaci isminde bir sınıf oluşturalım. Sınıf new ile türetildiğinde varsayılan ayarların atanması için yapılandırıcı (constructor) oluşturuluyor. Postala metodu ile gönderme işlemi başlatılacak. Burada yeni bir Thread oluşturuluyor, isBackground özelliği ile ana thread ile bağlantısız olarak arkaplanda çalışacağı belirleniyor ve Start ile uygulama start ediliyor. Burada oluşturulan Thread Postalayici metodunu çalıştırıyor. Postalayici metodunu inceleyelim, işlemin ne kadar sürdüğünü belirlemek için baslangic değişkenine şu anki zaman bilgisi yazılıyor. _strEx, _countEx değişkenleri ise gönderme işlemi içerisindeki hata sayısının ve hataların görüntülenmesini sağlar. smptServer Property si ile gönderme işlemi için kullanılacak olan smtp sunucusu (smtpmail.smtpserver) belirleniyor. Ardından for döngüsü ile Emailler Propertysindeki email adresleri kadar döngü işlemi yapılıyor. Eğer UyusunMu değişkeni True ise ikinci if kontrolüne bakılır. İkinci kontrol ise döngünün ilk basamağında (i=0) olmamasına ve UykuLimitinin gelip gelmediğine bakar. Ardından mailmessage sınıfından türeyen mesaj nesnesinin to özelliği şuanda gönderim yapılacak olan kişiyi belirliyor. SmtpMail.Send ile de gönderim işlemi yapılıyor. Bütün gönderim işlemi Try-Catch içerisinde yapılır ve oluşan hatalar bir değişkende biriktirilir. Döngü işlemini bitirdikten sonra bu hata mesajları FROM adresi ile belirlenen kişiye gönderiliyor.
Yukarıdaki sınıf tasarımını yaptıktan sonra bu sınıfı kullanmak için aşağıdaki gibi bir web form tasarlayınız. Kontrollerin isimleri sırasıyla txtFrom, txtSubject, txtBody, txtSmtpServer ve Button1 dir. Şekilde görünen webform uygulamasının codebehind dosyasına aşağıdaki kodu ekleyiniz.
Yukarıdaki metod ile email adreslerini dizi değişken olarak geriye döndürüyoruz. Burada sadece dört adet email adresine gönderim yapıldığı için threadinging faydası göz ile görülecek şekilde anlaşılamayabilir. Bu metod ile kendi hazırladığınız bir veritabanında email listesini çekerek çok sayıda kişiye gönderim yapabilirsiniz.
Yukarıdaki kod ile butona tıkladığında gerekli parametreler ile yeni nesneler oluşturulup Postaci sınıfınfan türetilen x nesnesinin Postala metodu çağrılıyor. Bu metodu çağırarak yeni bit thread içerisinde ve arkaplan da email gönderimine başlanır. Sayfa postback olup tekrar yüklenirken kullanıcı arabirimi normal biçimde görüntülenir. Sayfanın görsel unsurları mail gönderim işleminin bitmesini beklemez çünkü işlem arkaplanda yapılır. (isbackground) Bu durumda 50 bin kişiye email göndermek istediğiniz zaman işlemi başlatmanız yeterli olacaktır. Eğer uygulamayı uzaktaki bir web sunucusundan (hosting firmanızın web sunucusu olabilir) çalıştırıyorsanız, akşam iş yerinden çıkarken işlemi başlatıp, kendi bilgisayarınızı kapatıp gidebilirsiniz. Sabah geldiğinizde email adresinize durum raporunun maillendiğini göreceksiniz. Bahsedilen şekilde bu uygulamanın tüm müşterilerinize, sitenizin üyelerine mail gönderir hale gelmesi için AdresleriAl metodunun veritabanı bağlantılı olarak tekrar düzenlenmesi gerekebilir. Bu uygulama ASP.NET ile Threading konusunu anlatmayı amacıyla yazıldı. Daha esnek ve özelleştirilebilir bir uygulama tasarımı yapabilirsiniz. Örneğin mail mesajının içinde kişiye ismi ile hitap eden, kişiye özel bilgiler sunan bir uygulama yapabilirsiniz. Bunlar sizin uygulama tasarımınıza bağlı konular. Ayrıca HTML formatında mail göndermek için m.BodyFormat = Mail.MailFormat.Html yapmalısınız. Bu durumda m.Body özelliğine ise içinde html etiketleri barındıran bir mesaj metni atamalısınız. Bu makale ile gerçek hayatta bir çok kişinin ihtiyaç duyduğu bir konu üzerine değinmek istedim. Umarım makalenin birilerine faydası dokunur. |
|
| Bağlantılar: bilgininefendisi.net |
| Open Source Document Project | AUP&TOS |