البرمجة

تحسين تجربة مستخدم تطبيق Windows Form بأسلوب فعّال

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

أولاً وقبل كل شيء، يبدو أنك تواجه مشكلة في تحديث الواجهة الرسومية، مما يؤدي إلى تجميد الواجهة (Not Responding) أثناء تنفيذ عمليتي النوم والتحديث. يجب عليك استخدام BackgroundWorker أو Task لتجنب تجميد الواجهة الرسومية أثناء تنفيذ العمليات الطويلة. يمكن أن يكون ذلك على النحو التالي:

csharp
private async void button1_Click(object sender, EventArgs e) { // تعطيل عناصر واجهة المستخدم أثناء التنفيذ textBox1.Enabled = false; textBox2.Enabled = false; textBox3.Enabled = false; button1.Enabled = false; // استخدام async/await لتنفيذ العمليات بشكل غير متزامن await Task.Run(() => ExecuteShutdown()); } private void ExecuteShutdown() { int totalMilliseconds = ((inputHours * 3600) + (inputMinutes * 60) + inputSeconds) * 1000; Thread.Sleep(totalMilliseconds); // بعد انتهاء العملية، استخدم Invoke لتحديث واجهة المستخدم this.Invoke(new MethodInvoker(() => { // تمكين عناصر واجهة المستخدم بعد انتهاء التنفيذ textBox1.Enabled = true; textBox2.Enabled = true; textBox3.Enabled = true; button1.Enabled = true; // قم بتحديث واجهة المستخدم أو قم بتشغيل العملية التالية بحسب احتياجاتك richTextBox1.AppendText("test"); })); }

يعتبر هذا الكود أكثر فعالية في التعامل مع الواجهة الرسومية وتجنب تجميدها أثناء تنفيذ العمليات الطويلة.

ثانياً، يمكنك تحسين تنظيم الشيفرة البرمجية بشكل عام، على سبيل المثال، يمكنك استخدام TryParse لتجنب استخدام Convert.ToInt32 والتعامل بشكل آمن مع استثناءات.

ثالثًا، يمكنك استخدام خاصية using لضمان إغلاق الموارد بشكل صحيح، على سبيل المثال مع الـ NotifyIcon.

أخيرًا، لاحظ أن استخدام Thread.Abort لإنهاء الخيوط يعد أمرًا غير آمن. يفضل استخدام أساليب أكثر أمانًا مثل CancellationTokenSource للتحكم في الخيوط وإيقافها بشكل آمن.

المزيد من المعلومات

بالطبع، دعني أقدم لك بعض المزيد من المعلومات والاقتراحات:

  1. استخدام TryParse:
    يمكنك تحسين معالجة الإدخال باستخدام int.TryParse بدلاً من Convert.ToInt32. هذا يساعد في التعامل مع حالات إدخال غير صالحة بشكل أفضل.

    csharp
    private void textBox1_TextChanged(object sender, EventArgs e) { if (int.TryParse(textBox1.Text, out inputHours)) { // تم تحديث قيمة inputHours بشكل صحيح } else { // يمكنك إظهار رسالة خطأ للمستخدم هنا } }

    وكذلك لـ textBox2_TextChanged و textBox3_TextChanged.

  2. استخدام using للـ NotifyIcon:
    للتأكد من إغلاق الموارد بشكل صحيح، يمكنك استخدام using مع NotifyIcon:

    csharp
    using (NotifyIcon shutdownPCIcon = new NotifyIcon()) { // تفاصيل إعداد NotifyIcon هنا }
  3. استخدام CancellationTokenSource:
    بدلاً من استخدام Thread.Abort، يمكنك استخدام CancellationTokenSource لإيقاف الخيوط بشكل آمن. يساعد ذلك في تجنب مشاكل الأمان وتحسين إدارة الحياة الداخلية للتطبيق.

    csharp
    private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); private void ExecuteShutdown() { int totalMilliseconds = ((inputHours * 3600) + (inputMinutes * 60) + inputSeconds) * 1000; try { Task.Delay(totalMilliseconds, cancellationTokenSource.Token).Wait(); } catch (OperationCanceledException) { // تم إلغاء العملية بشكل آمن } this.Invoke(new MethodInvoker(() => { // تمكين عناصر واجهة المستخدم بعد انتهاء التنفيذ textBox1.Enabled = true; textBox2.Enabled = true; textBox3.Enabled = true; button1.Enabled = true; // قم بتحديث واجهة المستخدم أو قم بتشغيل العملية التالية بحسب احتياجاتك richTextBox1.AppendText("test"); })); } private void button2_Click(object sender, EventArgs e) { // إلغاء الخيوط عند الضغط على زر آخر cancellationTokenSource.Cancel(); }

هذه الاقتراحات تهدف إلى تحسين أمان البرنامج وفعاليته. كما يُفضل دائمًا البحث عن مستندات ومقالات حول أفضل الممارسات في تطوير تطبيقات Windows Form لتعزيز مهاراتك.

زر الذهاب إلى الأعلى