2012-11-30 19 views
5

उदाहरण के लिए, मैं विशिष्ट समय अंतराल (प्रति घंटा या दैनिक कार्यों) में एक फ़ंक्शन को कॉल करना चाहता हूं।विशिष्ट समय अंतराल में दोहराव वाले कार्य?

मैं पहले से ही टाइमर का उपयोग कर रहा हूं। लेकिन यह तब तक काम कर रहा है जब तक मेरा स्थानीय सर्वर काम कर रहा है। उदाहरण के लिए:

public static void StartYahooWeatherManager() 
{ 
    Timer t = new Timer(1000 * 60 * 60 * 6 /* 6 hours */); 
    t.Elapsed += new ElapsedEventHandler(WriteYahoWeatherRssItemToDb); 
    t.Start(); 
} 

private static void WriteYahoWeatherRssItemToDb(object o, ElapsedEventArgs e) 
{ 
    YahooWeatherManager.InsertYahooWeatherRssItem(YahooWeatherManager.GetYahooWeatherRssItem()); 
} 

मैं 6 घंटे अंतराल में डीबी को मौसम जानकारी लिखता हूं। परियोजना पहले से ही मेजबान में है। टाइमर इवेंट तब तक काम कर रहा है जब तक मेरा कंप्यूटर स्थानीय सर्वर चल रहा है।

प्रश्न:

मेरी कोड के बारे में गलत क्या है? (या WebProject में टाइमर का उपयोग करने के लिए तार्किक गलत?) क्यों स्थानीय सर्वर काम करते समय टाइमर काम कर रहा है?

समय अंतराल कार्यों को प्रबंधित करने का सबसे अच्छा तरीका क्या है? (एएसपीनेट की आवश्यकता नहीं है)

मुझे आशा है कि, मैं समस्या की व्याख्या कर सकता हूं। धन्यवाद।

+0

क्या आपको वास्तव में एएसपी.NET एप्लिकेशन में ऐसा करने की ज़रूरत है? क्या आपने विंडोज सेवा बनाने पर विचार किया है? –

+0

@ रुईजारीम्बा, कोई ज़रूरत नहीं, मैंने यह भी पूछा। 'समय अंतराल कार्यों को प्रबंधित करने का सबसे अच्छा तरीका क्या है?'। क्षमा करें, मैंने सवाल अपडेट किया। –

उत्तर

7

कारण है कि टाइमर बंद हो जाता है। जब यह सर्वर एप्लिकेशन को रोकता या रीसायकल करता है, तो ऐपडोमेन को आपके द्वारा शुरू किए गए सभी थ्रेड के साथ लाया जाता है। यही कारण है कि एक एएसपी.नेट आवेदन में दोहराए गए पृष्ठभूमि कार्यों को लिखना बहुत बुरा विचार है। फिल हैक blogged about the dangers

ऐसा करने का सही तरीका यह है कि इस कोड को आपके एएसपी.NET एप्लिकेशन के बाहर एक अलग प्रक्रिया में होस्ट करें। यह एक विंडोज सेवा या कंसोल एप्लिकेशन हो सकता है जो कि विंडोज शेड्यूलर उदाहरण के लिए नियमित अंतराल पर चलने के लिए निर्धारित है। इस तरह कोड हमेशा चलाने के लिए गारंटी है।

2

मेरा सुझाव एक विंडोज सेवा बनाना है जो टाइमर का उपयोग करता है, या एक सामान्य अनुप्रयोग बनाता है और इसे आवश्यक अंतराल में चलाने के लिए निर्धारित समय निर्धारित करता है। यह StackOverflow पोस्ट आप मदद कर सकते हैं: क्योंकि इस टाइमर जो अपने आप में एक वेब सर्वर पर होस्ट किया गया है अपने ASP.NET अनुप्रयोग में चलाता

Windows service and timer

+0

+1। बहुत बहुत धन्यवाद... –

0

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

दूसरा अच्छा समाधान कंसोल एप्लिकेशन बनाना और इसे "Task Scheduler" में शेड्यूल करना है। कब और कैसे चलाना है, यह प्रबंधित करने के लिए आपके पास UI अच्छा होगा। "Windows Service" से ऐसे कार्यों को बनाए रखना बहुत आसान है और कम कोड लिखना आवश्यक है।

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