سؤال

لدي علة غريبة، من فضلك، اسمحوا لي أن أعرف إذا كان لديك أي أدلة حول السبب.

انا املك Timer (System.Windows.Forms.Timer) على شكلي الرئيسي، الذي ينطلق بعض التحديثات، والتي تقوم أيضا في النهاية بتحديث النموذج الرئيسي UI. ثم لدي محرر، يتم فتحه من النموذج الرئيسي باستخدام ShowDialog() طريقة. على هذا المحرر لدي PropertyGrid (System.Windows.Forms.PropertyGrid).

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

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

ماذا يمكنك أن تنصح؟ أي أفكار موضع ترحيب.

هل كانت مفيدة؟

المحلول

ما يحدث هو أن طريقة التجزئة في Timer الخيط لا تنفذ على مؤشر ترابط مختلف، لذلك فهي قفل كل شيء آخر حتى يتم ذلك. لقد قمت بإجراء اختبار WinForms الذي يحتوي على توقيت وأزرار 2 على ذلك قامت أحداثها بذلك:

private void timer1_Tick(object sender, EventArgs e)
{
    Thread.Sleep(6000);
}

private void button1_Click(object sender, EventArgs e)
{
    timer1.Start();
}

private void button2_Click(object sender, EventArgs e)
{
    frmShow show = new frmShow();
    show.ShowDialog(); // frmShow just has some controls on it to fiddle with
}

وبالفعل منعت كما وصفت. ما يلي حلها:

private void timer1_Tick(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(DoStuff);
}

private void DoStuff(object something)
{
    Thread.Sleep(6000);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top