C# Programming

آليات التأخير الفعّالة في C#

Spread the love

تُعدّ التأخيرات أمرًا ضروريًا في العديد من تطبيقات C#، بدءًا من تعزيز استجابة واجهة المستخدم وحتى إدارة العمليات غير المتزامنة المعقدة. إن اختيار آلية التأخير المناسبة أمر بالغ الأهمية لكتابة شفرة فعالة وقوية. تتناول هذه المقالة طرقًا مختلفة لتنفيذ التأخيرات في C#، مع تسليط الضوء على نقاط القوة والضعف الخاصة بها لإرشادك في اختيار النهج الأمثل لسياقك المحدد.

محتويات الجدول

استخدام Thread.Sleep() للتأخيرات

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


using System;
using System.Threading;

public class ThreadSleepExample
{
    public static void Main(string[] args)
    {
        Console.WriteLine("بدء...");
        Thread.Sleep(2000); // إيقاف مؤقت لمدة ثانيتين
        Console.WriteLine("انتهى!");
    }
}

توظيف Task.Delay() للتأخيرات غير المتزامنة

يوفر Task.Delay() نهجًا أكثر حداثة وكفاءة. فهو يستفيد من البرمجة غير المتزامنة، مما يتيح لمهام أخرى مواصلة التنفيذ بالتزامن أثناء إجراء التأخير. هذا يمنع حظر الخيط الرئيسي، مما يجعله مثاليًا للتطبيقات المستجيبة.


using System;
using System.Threading.Tasks;

public class TaskDelayExample
{
    public static async Task Main(string[] args)
    {
        Console.WriteLine("بدء...");
        await Task.Delay(2000); // إيقاف مؤقت لمدة ثانيتين بشكل غير متزامن
        Console.WriteLine("انتهى!");
    }
}

الاستفادة من System.Timers.Timer للمهام المتكررة

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


using System;
using System.Timers;

public class SystemTimersTimerExample
{
    public static void Main(string[] args)
    {
        Timer timer = new Timer(2000); // ضبط الفاصل الزمني إلى ثانيتين
        timer.Elapsed += (sender, e) =>
        {
            Console.WriteLine("انتهى المؤقت!");
            timer.Stop(); // إيقاف المؤقت بعد تنفيذ واحد
        };
        timer.AutoReset = false; // التشغيل مرة واحدة فقط
        timer.Start();
        Console.WriteLine("بدأ المؤقت...");
        Console.ReadKey(); // إبقاء وحدة التحكم مفتوحة
    }
}

الاستفادة من System.Threading.Timer للتحكم الدقيق

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


using System;
using System.Threading;

public class SystemThreadingTimerExample
{
    public static void Main(string[] args)
    {
        Timer timer = new Timer(TimerCallback, null, 2000, Timeout.Infinite);
        Console.WriteLine("بدأ المؤقت...");
        Console.ReadKey(); // إبقاء وحدة التحكم مفتوحة
    }

    private static void TimerCallback(object state)
    {
        Console.WriteLine("انتهى المؤقت!");
    }
}

الخلاصة: اختيار طريقة التأخير المناسبة

تعتمد الطريقة المثلى لإنشاء التأخيرات في C# كليًا على متطلباتك المحددة. بالنسبة للتأخيرات البسيطة داخل طريقة واحدة، يُفضل عمومًا Task.Delay() نظرًا لطبيعته غير المتزامنة وسلوكه غير الحاجز. بالنسبة للمهام المتكررة أو السيناريوهات التي تتطلب تحكمًا دقيقًا، فإن System.Timers.Timer أو System.Threading.Timer أكثر ملاءمة. تجنب استخدام Thread.Sleep() إلا إذا كان ذلك ضروريًا تمامًا وفهمت تمامًا آثار الحجب الخاصة به. دائمًا ما تعطي الأولوية للطريقة التي توازن بشكل أفضل بين البساطة والكفاءة وسلامة الخيوط لتطبيقك.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *