"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تجنب تجميد واجهة المستخدم عند تأخير العمليات في WPF؟

كيفية تجنب تجميد واجهة المستخدم عند تأخير العمليات في WPF؟

تم النشر بتاريخ 2024-11-06
تصفح:752

How to Avoid UI Freezing When Delaying Operations in WPF?

تأخير العمليات في WPF

يعد تأخير العملية في WPF أمرًا ضروريًا لتعزيز تجربة المستخدم وضمان الانتقالات السلسة. أحد السيناريوهات الشائعة هو إضافة تأخير قبل الانتقال إلى نافذة جديدة.

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

لمعالجة هذا القيد، يوصى باستخدام تقنيات غير متزامنة مثل DispatcherTimer، أو Task.Delay، أو async/await.

الطريقة الأولى: استخدام DispatcherTimer

توفر فئة DispatcherTimer طريقة لتنفيذ إجراء بعد فترة زمنية محددة.

tbkLabel.Text = " تأخير لمدة ثانيتين"؛ var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) }; timer.Start(); timer.Tick = (sender, args) => { timer.Stop(); صفحة فار = صفحة جديدة2(); page.Show(); };
tbkLabel.Text = "two seconds delay";

var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };
timer.Start();
timer.Tick  = (sender, args) =>
{
    timer.Stop();
    var page = new Page2();
    page.Show();
};

الطريقة الثانية: استخدام Task.Delay

Task.Delay هي طريقة تُرجع مهمة تكتمل بعد تأخير محدد.

tbkLabel.Text = "تأخير ثانيتين"; Task.Delay(2000).ContinueWith(_ => { صفحة فار = صفحة جديدة2(); page.Show(); });
tbkLabel.Text = "two seconds delay";

var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };
timer.Start();
timer.Tick  = (sender, args) =>
{
    timer.Stop();
    var page = new Page2();
    page.Show();
};

الطريقة الثالثة: استخدام Async/Await (يتطلب .NET 4.5 أو أعلى)

يوفر بناء جملة Async/await طريقة أكثر أناقة وقابلية للقراءة للتعامل مع غير المتزامن العمليات.

public async void TheEnclosingMethod() { tbkLabel.Text = "تأخير ثانيتين"; انتظر Task.Delay(2000); صفحة فار = صفحة جديدة2(); page.Show();
tbkLabel.Text = "two seconds delay";

var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };
timer.Start();
timer.Tick  = (sender, args) =>
{
    timer.Stop();
    var page = new Page2();
    page.Show();
};
باستخدام هذه التقنيات غير المتزامنة، يظل مؤشر ترابط واجهة المستخدم مستجيبًا، ويرى المستخدم رسالة "تأخير ثانيتين" لفترة التأخير بأكملها قبل الانتقال إلى الصفحة الجديدة بسلاسة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3