2010-01-27 12 views
5

मेरा एप्लिकेशन आईएस 6 (विंडोज 2003) पर चल रहा एएसपीनेट 3.5 है। यह एप्लिकेशन प्रतिदिन 1000 उपयोगकर्ताओं (100-500 उपयोगकर्ता ऑनलाइन) की सेवा कर रहा है।asp.net थ्रेडपूल - लंबे समय तक चलने वाला ऑपरेशन

मैं ग्राहकों को साप्ताहिक ग्राहकों को एक ईमेल न्यूजलेटर भेजना चाहता हूं।

हर बार लगभग 200,000 ईमेल।

इस कोड मैं का उपयोग कर रहा है:

ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncProcessMailerQueue), null); 

private static void AsyncProcessMailerQueue(object data) 
{ 
    for (int i=0;i<users.count ; i++) 
    { 
     MailMessage message = new MailMessage(); 
     ....... 
     SmtpClient smtpClient = new SmtpClient(); 
     smtpClient.Send(message); 
    } 
} 

जब (मेरे देव मशीन पर) इस स्थानीय स्तर पर परीक्षण मैं देख रहा हूँ आवेदन एक बहुत काम कर धीमी है।

  1. क्या इस कोड को लिखने का कोई बेहतर तरीका है?
  2. मैं ThreadPool.QueueUserWorkItem का उपयोग करें या थ्रेड टी का उपयोग कर एक नया धागा बनाना चाहिए = नया थ्रेड (नई ThreadStart (DoWork)); ?
  3. न्यूज़लेटर्स भेजने के उद्देश्य के लिए एक पूरी तरह से अलग आवेदन बनाना बेहतर होगा। क्या यह मदद करेगा यदि इस एप्लिकेशन को उसी मशीन पर बीमार चलाया जाए?

मैंने अन्य पोस्ट यहां थ्रेडपूल बनाम थ्रेड के बारे में बात करते हुए देखा है लेकिन ऐसा लगता है कि कोई भी बेहतर नहीं है।

उत्तर

3

वरीयता के क्रम में:

  1. अन्य अनुप्रयोग बनाएँ। Windows सेवा एक अच्छा विकल्प
  2. उपयोग Thread t = new Thread(new ThreadStart(DoWork));
  3. आपका वर्तमान कार्यान्वयन
+0

धन्यवाद! , अगर मैं एक विंडोज सेवा बना देता हूं, तो क्या मुझे उसमें धागे का उपयोग करना चाहिए? अगर मैं एएसपीनेट का उपयोग करता रहता हूं, थ्रेडपूल का उपयोग करने से नया धागा बेहतर क्यों है? – RuSh

+0

हां, धागे का उपयोग करने की सिफारिश की जाती है। यदि आप ASP.NET का उपयोग करते रहें तो लंबे समय तक चलने वाले कार्यों के लिए थ्रेडपूल का उपयोग करना एक बुरा विचार है क्योंकि इन धागे का उपयोग सेवा अनुरोधों के लिए किया जाता है और यदि आपके पास उनमें से कई ऐसे ऑपरेशन के लिए अवरुद्ध हैं, तो साइट काम करना बंद कर सकती है। –

2

asp.net से बाहर ले जा रहा है एक अच्छा विकल्प हो सकता है किया जाएगा। यह कमांड प्रॉम्प्ट से चलने वाला एक सरल कमांड लाइन ऐप हो सकता है। आपको एक सेवा की आवश्यकता क्यों है या इसे यूआरएल के रूप में होस्ट किया जाना चाहिए?

+0

मुझे इसे यूआरएल के रूप में होस्ट करने की आवश्यकता नहीं है, लेकिन यह इतना आसान है क्योंकि मेरे पास इस एएसपीनेट प्रोजेक्ट में पहले से ही सभी फ़ंक्शन/डेटा एक्सेस कोड हैं। – RuSh

+0

@ शाररू, आप परियोजना को विभिन्न हिस्सों में तोड़ सकते हैं और सभी फ़ंक्शन एक्सेस और डेटा सामग्री को साझा प्रोजेक्ट में अलग किया जा सकता है। यह वैसे भी अच्छा डिजाइन है, भले ही आपके पास चलाने के लिए यह अलग प्रक्रिया न हो। –

+0

इसके लिए देर हो चुकी है :) यह एक बड़ी परियोजना है। मैं संबंधित कोड को सटीक कर सकता हूं और इसका उपयोग कर सकता हूं, या मैं सेवा में एएसपीनेट डीएल का उपयोग कर सकता हूं, नहीं? – RuSh

1

हाँ मुझे लगता है कि आपको इसे अपने वेब ऐप से बाहर ले जाना चाहिए, क्योंकि आप अपने अनुरोधों को पूरा करने के लिए आवश्यक थ्रेड पूल से थ्रेड ले रहे हैं (जैसे आपको अच्छी तरह से ट्रैफ़िक मिलता है)।

आप सिंक्रनाइज़ेशन से भी ईमेल भेज रहे हैं जिसका अर्थ यह है कि थ्रेड का उपयोग करने की तुलना में बहुत लंबे समय तक उपयोग किया जा रहा है - यदि आप इस थ्रेडपूल दृष्टिकोण का उपयोग करना जारी रखते हैं तो मैं उन्हें आईआईएस एसएमटीपी सेवा (सिस्टम देखें। Net.Mail.SmtpClient.DeliveryMethod) जो सिर्फ एक कतार फ़ोल्डर में एक फ़ाइल लिखता है, जिसका आईआईएस एसएमटीपी सेवा द्वारा निगरानी की जाती है।

लेकिन वास्तव में आपको इसे विंडोज़ सेवा में ले जाने पर विचार करना चाहिए।

+0

धन्यवाद! , यह एक अच्छी सलाह की तरह लगता है! मुझे लगता है कि यह SmtpClient का डिफ़ॉल्ट व्यवहार नहीं है? – RuSh

+0

कोई समस्या नहीं है। नहीं, यह डिफ़ॉल्ट व्यवहार नहीं है, ऐसा करने के लिए आपको mySmtpClientInstance.DeliveryMethod = DeliveryMethod.TickupDirectoryFromIis सेट करना होगा और यह सुनिश्चित करना होगा कि आईआईएस एसएमटीपी सेवा चल रही है। सौभाग्य.. – JonoW

संबंधित मुद्दे