واجهة المستخدم لا يزال عدم استجابة بعد استخدام التحكم.begininvoke

StackOverflow https://stackoverflow.com/questions/881202

  •  22-08-2019
  •  | 
  •  

سؤال

لقد قدمت C# winforms التطبيق.الآن لدي نموذج الذي يحتوي على الكثير من الأزرار ، والتي استدعاء عدد كبير الطحن الوظائف التي خرج تحديث في مربع نص.أدعو مربع النص.begininvoke (طريقة) التي تمر مندوب وظيفة التحديثات التي نص في مربع النص ، ومع ذلك عندما نص ضخمة ، شكل هو عدم استجابة كما لا استطيع ان اضغط على زر إلغاء الأمر.ليس هناك أي طريقة حتى أن كل شكل استجابة وكذلك التحديث أيضا يحدث.يجب أن تظهر البيانات إلى المستخدم كما هو قادم لا أستطيع العازلة كل شيء و تظهر في نهاية المطاف.كما أنني حاولت لتنفيذ بلدي العازلة تظهر البيانات في فترات الذي يعمل كبيرة على كمية صغيرة من النص ، ولكن في كمية كبيرة واجهة المستخدم فقط لا يستجيب.أي مساعدة ؟ شكرا

تحديث السؤال بعض التباسات الناشئة

  • لقد دعا عدد الطحن الوظيفة في موضوع مستقل.
  • أن عدد الطحن المكالمات وظيفة التحكم.begininvoke وظيفة كلما البيانات يصل إلى تحديث مربع نص
  • بلدي واجهة المستخدم يحصل ليتم عرضها و أرى الإخراج القادمة ، ولكن عندما تكون البيانات الضخمة ، لا أستطيع فعل أي نشاط آخر على الرغم من أنني لا تزال ترى واجهة المستخدم
هل كانت مفيدة؟

المحلول

داعيا BeginInvoke (أو الاحتجاج) لن تشتري أي شيء إلا إذا كان عدد الطحن وظيفة يعمل على ترابط آخر من UI.

النظر في التعليمات البرمجية التالية:

private void HardWork(object state)
{
    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(500);
        SetText(i.ToString());
    }
}

private void SetText(string text)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action<string>(SetText), text);
    }
    else
    {
        textBox1.Text = text;
    }
}
private void Button_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(HardWork);            
}

على Button_Click طريقة البدء في تنفيذ طريقة HardWork في موضوع مستقل.العمل الجاد سوف تفعل بعض تجهيز (محاكاة عن طريق Thread.Sleep الدعوة) ومن ثم استدعاء الأسلوب لعرض بعض التقدم.داخل هذا الأسلوب ، نحن بحاجة إلى التحقق من ما إذا كنا على UI أو لا.إذا لم نكن نحن الاحتجاج نفس طريقة استخدام Invoke (أو BeginInvoke) من أجل إجبارها على تنفيذ UI.

تحديث:إذا كانت كمية البيانات المنبعثة من عدد الطحن الطريقة كبيرة جدا ، وهذا يمكن بالطبع أن يكون لها تأثير سلبي على استجابة واجهة المستخدم.إذا كنت على سبيل المثال تتراكم كمية كبيرة من النص في الخيوط طريقة تنبعث منها هذا النص على كل تحديث, التي سوف تكون أبطأ من انبعاث ما قد تغير منذ آخر تحديث.الشيء نفسه ينطبق على النص مربع ؛ داعيا مربع نص.AppendText فقط مع النص الجديد سيكون أسرع من repedetly تعيين مربع النص.الخاصية Text.

من الصعب أن تعطي أكثر تفصيلا الأفكار حول كيفية حل مشكلة خاصة بك وبما أننا قد لا نرى ما التعليمات البرمجية الخاصة بك في الواقع لا.

نصائح أخرى

لقد فهمت الأمر بالعكس.

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

BeginInvoke هو ببساطة "تنفيذ ما يلي في الموضوع أن تحكم تم إنشاؤه أصلا في" الذي هو UI.

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

ويساعد هذا الأمل

وظيفة التحديثات مربع النص تفعل ذلك قطعة قطعة و الاتصال DoEvents بين كل تحديث.هذا هو تفريق سلسلة ...

update piece 1
DoEvents
update piece 2
DoEvents
...
update piece n
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top