मैं सटीक अंतराल के साथ धागे को कैसे दोहराऊं? सी#


सी#
 private volatile bool _pause = false;
 private ManualResetEvent _pauseEvent = new ManualResetEvent(true);
 private Thread m_thread;
 private bool _istoday = true;
 private bool _isTimer_stop = false;
 private bool _thread_start = true;

private void btn_start_Click(object sender, EventArgs e)
 {

     int timer_interval = (int)numeric_app_freequency.Value;

         timer1_Tick(sender, e);
         timer1.Interval = 60 * 1000 * timer_interval;
         timer1.Enabled = true;
         timer1.Start(); //

 }

 private void timer1_Tick(object sender, EventArgs e)
 {
     if (_thread_start == true)
       {
         _thread_start = false;
         _istoday = true;
         m_thread = new Thread(new ThreadStart(begin_thread));
         m_thread.Name = "thred_1";
         m_thread.IsBackground = true;
         m_thread.Start();

        }

 }

 private void begin_thread()
 {

     int pageNum = 1;

     while (_pauseEvent.WaitOne())
     {
         if (_istoday == true)
         {

             parse_trs(pageNum);
             pageNum++;

         }
         else
         {
             Textbox1.Text = "Work is done"; ;
             break;
         }

     }
     _autoEvent.Set();
 }

 private void parse_trs(int pageNum)
 {
     string str_pageNum = pageNum.ToString();

     string list_url = "http://somedomain.com/bbs/board.php?bo_table=funny&page=" + str_pageNum;

     WebClient client = new WebClient();
     string sourceUrl = client.DownloadString(list_url);

     HtmlAgilityPack.HtmlDocument mydoc = new HtmlAgilityPack.HtmlDocument();

     mydoc.LoadHtml(sourceUrl);


     HtmlNodeCollection tr_col = mydoc.DocumentNode.SelectNodes("/ html / body//div[@id="bo_list"]//table/tbody/tr");

     foreach (HtmlNode node in tr_col)
     {

         _pauseEvent.WaitOne();


         if (post_date == today_date)
         {

             Do work.......................................

         }
         else
         {
             _istoday = false;
             break;
         }

     }
 }

मैंने क्या प्रयास किया है:

मैंने टाइमर के बजाय व्हाइल लूप का उपयोग किया है लेकिन सीपीयू ओवरलोड हो जाता है इसलिए एप्लिकेशन रुक जाता है

समाधान 1

किसी थ्रेड के निकट-आवधिक व्यवहार को प्राप्त करने के लिए यह संभवतः सबसे खराब डिज़ाइन है। इसके अनेक कारण हैं, उन सब पर चर्चा करने की आवश्यकता नहीं है। एक नए थ्रेड इंस्टेंस के निर्माण और इसे शुरू करने की लागत कारकों में से एक है, लेकिन, अब तक, सबसे खराब नहीं है। सबसे बुरी बात सब कुछ गड़बड़ाने की आसान संभावना है।

बेहतर सीधा समाधान केवल एक अतिरिक्त थ्रेड का निर्माण होगा और इसे लगभग पूरे एप्लिकेशन जीवनकाल के दौरान निष्पादित करना होगा। आप इसे बस एक “अनंत” लूप में निष्पादित करते हैं (वास्तव में, केवल तभी टूटता है जब एप्लिकेशन बंद होने वाला होता है) और एक इवेंट वेट हैंडल ऑब्जेक्ट का उपयोग करके इसकी गतिविधि को दबा देते हैं।

कॉल पर यह समझना महत्वपूर्ण है WaitHandle.WaitOne धागा या तो गुजरता है या किसी विशेष में डाल दिया जाता है प्रतीक्षा अवस्था; इसे बंद कर दिया जाता है और जब तक यह जागृत नहीं हो जाता, तब तक इसे कभी भी निष्पादन के लिए शेड्यूल नहीं किया जाता है, जो कि होता रहता है Thread.Abort, Thread.Interrupt, टाइमआउट, और अन्य घटनाएं, विशेष रूप से, किसी अन्य थ्रेड से प्रतीक्षा हैंडल ऑब्जेक्ट को सिग्नल करना। इस तरह, थ्रेड प्रतीक्षा स्थिति में शून्य सीपीयू समय खर्च करता है, कोई स्पिन प्रतीक्षा नहीं होती है, राज्य की आवधिक जांच नहीं होती है, कुछ भी नहीं।

कृपया देखें: इवेंटवेटहैंडल क्लास (सिस्टम.थ्रेडिंग)[^].

कृपया मेरे पिछले उत्तर देखें:
कोड थ्रेड को सुरक्षित बनाना[^],
चल रहे धागे को रोकें[^],
थ्रेड में मैन्युअल रीसेट इवेंट और ऑटो रीसेट इवेंट[^],
वेबसेवा में ठीक एक कार्य/थ्रेड/प्रक्रिया चलाना जो कभी समाप्त नहीं होगी (asp.net)[^].

अवरुद्ध संग्रह का उपयोग करने की वैकल्पिक संबंधित तकनीक पर विशेष ध्यान दें; यह आपके तात्कालिक प्रश्न से असंबंधित है लेकिन समझना महत्वपूर्ण है।

अब, आइए टाइमर द्वारा “आवधिक” पुनरावृत्ति पर वापस आएं। मुझे यकीन नहीं है कि आपको इसकी इस तरह से आवश्यकता है। एक विकल्प यह होगा कि कोड के टुकड़े को थ्रेड में अपने आप दोहराया जाए, वर्तमान वास्तविक समय लिया जाए, जैसे, System.DateTime.Nowअगले निष्पादन समय और कॉलिंग की गणना Thread.Sleep उचित अवधि के साथ. लेकिन अगर आपको वास्तव में टाइमर की आवश्यकता है (फिर से, मुझे नहीं पता क्यों), तो इसका एकमात्र कार्य कॉल करके इवेंट वेट हैंडल को सिग्नल करना होगा EventWaitHandle.Set(), जो इस इवेंट हैंडल इंस्टेंस पर प्रतीक्षा कर रहे थ्रेड को जगाता है। ध्यान दें कि यह कॉल कुछ तरीकों की लगभग किसी भी अन्य कॉल के विपरीत, थ्रेड-सुरक्षित है। यह भी ध्यान दें कि टाइमर घटना कुछ थ्रेड में होती है जिसे आप नहीं जानते हैं (वास्तव में खराब को छोड़कर)। System.Windows.Forms.Timer जो यूआई थ्रेड में टिक हैंडलर को आमंत्रित करता है, लेकिन यह “राहत” इसका एकमात्र लाभ है; ज्यादातर मामलों में, इसका उपयोग कभी नहीं किया जाना चाहिए, क्योंकि समय बेहद खराब है)।

दोनों तकनीकें आपके सामने आने वाली सबसे बड़ी समस्या का समाधान करती हैं। यदि आपके पिछले टाइमर टिक के कारण होने वाली प्रोसेसिंग अभी तक पूरी नहीं हुई है तो आप कुछ प्रोसेसिंग शुरू करते हैं तो क्या हो सकता है? सभी संभावित गड़बड़ियों की कल्पना करना कठिन हो सकता है। मेरे द्वारा सुझाए गए समाधान इस समस्या से पूरी तरह मुक्त हैं।

-एसए

コメント

タイトルとURLをコピーしました