كيف يمكنني تكرار الموضوع مع الفاصل الزمني المحدد؟ ج #


ج #
 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;
         }

     }
 }

ما حاولت:

لقد استخدمت حلقة while بدلاً من المؤقت ولكن وحدة المعالجة المركزية تزيد التحميل لذا يتجمد التطبيق

الحل 1

من المحتمل أن يكون هذا هو التصميم الأسوأ للحصول على بعض السلوك الدوري شبه الدوري لسلسلة الرسائل. هناك أسباب كثيرة لذلك، ولا داعي للحديث عنها كلها. تعد تكلفة إنشاء مثيل مؤشر ترابط جديد وبدء تشغيله أحد العوامل، ولكنها ليست الأسوأ على الإطلاق. أسوأ شيء هو الاحتمال السهل لإفساد كل شيء.

سيكون الحل المباشر والأفضل بكثير هو إنشاء مؤشر ترابط إضافي واحد فقط والحفاظ عليه قيد التنفيذ طوال فترة عمر التطبيق تقريبًا. يمكنك ببساطة تنفيذه في حلقة “لا نهائية” (في الواقع، يتم قطعها فقط عندما يكون التطبيق على وشك الإغلاق) وخنق نشاطه باستخدام كائن مقبض انتظار الحدث.

من المهم أن تفهم ذلك أثناء المكالمة WaitHandle.WaitOne إما أن يمر الخيط أو يتم وضعه على مكان خاص حالة الانتظار; يتم إيقاف تشغيله ولا تتم جدولته مرة أخرى للتنفيذ حتى يتم إيقاظه، وهو ما يحدث Thread.Abort, Thread.Interruptوالمهلة والأحداث الأخرى، على وجه الخصوص، الإشارة إلى كائن مقبض الانتظار من مؤشر ترابط آخر. بهذه الطريقة، يقضي الخيط صفرًا من وقت وحدة المعالجة المركزية في حالة الانتظار، ولا يوجد انتظار دوران، ولا فحوصات دورية للحالة، ولا شيء.

لطفا أنظر: فئة EventWaitHandle (System.Threading)[^].

يرجى الاطلاع على إجاباتي السابقة:
جعل سلسلة التعليمات البرمجية آمنة[^],
إيقاف تشغيل الخيط مؤقتًا[^],
ManualResetEvent وAutoResetEvent في الموضوع[^],
تشغيل مهمة/سلسلة/عملية واحدة بالضبط في خدمة الويب والتي لن يتم إنهاؤها أبدًا (asp.net)[^].

إيلاء اهتمام خاص للتقنية البديلة ذات الصلة باستخدام مجموعة الحظر؛ لا علاقة له بسؤالك المباشر ولكن من المهم أن تفهمه.

الآن، دعونا نعود إلى التكرار “الدوري” بالمؤقت. لست متأكدًا من أنك بحاجة إليها بهذه الطريقة. قد يكون أحد البدائل مجرد تكرار جزء من التعليمات البرمجية في سلسلة رسائل من تلقاء نفسها، مع أخذ الوقت الفعلي الحالي من، على سبيل المثال، System.DateTime.Nowوحساب وقت التنفيذ التالي والاتصال Thread.Sleep مع المدة المناسبة. ولكن إذا كنت تحتاج حقًا إلى مؤقت (مرة أخرى، لا أعرف السبب)، فستكون وظيفته الوحيدة هي إرسال إشارة إلى مقبض انتظار الحدث عن طريق الاتصال EventWaitHandle.Set()، الذي ينشط الخيط الذي ينتظر مثيل مقبض الحدث هذا. لاحظ أن هذا الاستدعاء آمن لسلسلة العمليات، على عكس أي استدعاء آخر لبعض الطرق تقريبًا. لاحظ أيضًا أن حدث المؤقت يحدث في بعض سلاسل الرسائل التي لا تعرفها (باستثناء أنها سيئة للغاية System.Windows.Forms.Timer الذي يستدعي معالج التجزئة في مؤشر ترابط واجهة المستخدم، ولكن هذا “الإغاثة” فائدته الوحيدة؛ وفي معظم الحالات، لا ينبغي استخدامه مطلقًا، لأن التوقيت سيء للغاية).

كلتا التقنيتين تحلان أكبر مشكلة قد تواجهها. ماذا يمكن أن يحدث إذا بدأت بعض المعالجة إذا لم تكتمل المعالجة الناتجة عن علامة المؤقت السابقة الخاصة بك بعد؟ قد يكون من الصعب تخيل كل الفوضى المحتملة. الحلول التي أقترحها خالية تماما من هذه المشكلة.

-سا

コメント

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