انتظار ثانية في كل مرة في حلقة في c#باستخدام Thread.Sleep




system (2)

أحاول طباعة "p" على الشاشة كل ثانية.

عندما أركض هذا:

while (true)
    Thread.Sleep(1000); 
    Console.WriteLine("p");

انها لا تطبع على الاطلاق. ولكن عندما أركض هذا:

while (true)
    Console.WriteLine("p");
    Thread.Sleep(1000); 

لها الطباعة دون انتظار على الإطلاق. هل يمكن لشخص ما شرح هذا لي واقتراح حل؟


لماذا لم تنجح من دون الحمالات؟

C # ليس بيثون. في بيثون ، يشار إلى بنية البرنامج بالمسافات. في C # whitespace يتم تجاهله بالكامل ويتم تحديد بنية البرنامج من خلال قواعد اللغة.

في C # كتلة النموذج { any number of statements } هي في حد ذاتها عبارة.

قواعد النحو هو

while( an expression that can be evaluated to bool ) 
    a single statement

ولكن بما أن { ... } عبارة مفردة ، إذا كنت تريد عبارات متعددة في النص الخاص بك ، أو if ، أو for أو foreach وهلم جرا ، يمكنك استخدام كتلة.

بالمناسبة ، يجب أن لا تستخدم Thread.Sleep في المقام الأول . يجب أن تستخدم فقط في اختبار رمز. مؤشرات الترابط موارد برنامج باهظة الثمن؛ لا تدفع لهم النوم! إذا كنت ترغب في تقديم تأخير ، فهناك شيئان للقيام به. في برنامج يستند إلى الحدث ، ابدأ مؤقتًا ثم قم بمعالجة حدث المؤقت عندما يتم تشغيله. أو اجعل البرنامج غير متزامن Task.Delay . النوم ممارسة سيئة ويشير إلى وجود بعض العيوب في تصميم البرنامج.

الآن ، يمكنك القول ، هذا هو برنامج وحدة التحكم وأريد حقًا تقديم تأخير في تجربة المستخدم الخاصة بي ، وليس لدي أي أحداث تتم معالجتها في الخلفية ، وما إلى ذلك ، فلماذا لا تنام؟ ويمكنني أن أفهم هذه الحجة ؛ انها مريحة. ومع ذلك ، (1) احصل على عادات جيدة الآن بينما لا تزال مبتدئًا ولن تضطر إلى كسرها لاحقًا ، (2) تتطور البرامج. في مرحلة ما ، ترغب في كتابة برنامج يبقى تفاعليًا ويستجيب لضغطات المستخدم أو حركة مرور الشبكة أو أي شيء آخر من هذا القبيل ، بينما يتم إيقاف واجهة المستخدم مؤقتًا ؛ إذا كانت مؤشرات الترابط الخاصة بك نائمة ، فإنها لا تستجيب لتلك الأحداث.


أنت لا تحلق الكود كله

هذه :

while (true)
    Thread.Sleep(1000); 
    Console.WriteLine("p");

هو نفسه هذا:

while (true)
{
    Thread.Sleep(1000); 
}
Console.WriteLine("p");

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

شيء من هذا القبيل هو ما تبحث عنه:

while (true)
{
    Thread.Sleep(1000); 
    Console.WriteLine("p");
}




system