نماذج Windows خيوط وأحداث - ListBox التحديثات على الفور ولكن progressbar تجارب ضخمة تأخير

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

سؤال

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

الرئيسية مختومة فئة 'ImportController' التي لا عمل تعلن التالية مندوب الحدث:

public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;

النافذة الرئيسية يبدأ أسلوب ثابت في تلك الفئة باستخدام موضوع جديد:

Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);

على ImportProgressEvent وسائط يحمل سلسلة رسالة ماكس الباحث قيمة شريط التقدم و التقدم الحالي الباحث قيمة.نموذج Windows subcribes الحدث:

ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);

ويستجيب هذا الحدث في هذه الطريقة باستخدام الخاصة مندوب:

    private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax);

private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e)
            {
                this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax);
            }

أخيرا شريط التقدم و listbox يتم تحديثها:

private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax)
        {
            string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string item in items)
            {
                this.lstTasks.Items.Add(item);
            }

            if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax)
            {
                this.ImportProgressBar.Maximum = progressMax;
                this.ImportProgressBar.Value = currentProgress;
            }
        }

الشيء هو ListBox يبدو أن التحديث بسرعة جدا ، ولكن شريط التقدم لم يتحرك حتى دفعة كاملة تقريبا على أي حال ???ما يعطي ؟

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

المحلول 4

@جون

شكرا على الروابط.

@سوف

لا يوجد مكسب من threadpooling وأنا أعلم أنه سوف من أي وقت مضى فقط تفرخ موضوع واحد.استخدام الخيط هو محض أن يكون استجابة واجهة المستخدم أثناء SQL Server قصفت مع يقرأ ويكتب.بالتأكيد انها ليست قصيرة الخيط.

فيما يتعلق زلاجة المطرقة أنت على حق.ولكن كما اتضح مشكلتي كانت بين الشاشة و الكرسي بعد كل شيء.لا يبدو أن unusal دفعة من البيانات يحتوي على العديد من العديد من العديد من المفاتيح الخارجية السجلات من دفعات و يحدث فقط للحصول على اختيارها في وقت مبكر في عملية معنى currentProgress لا يحصل ++'d لمدة 10 ثوان.

@جميع

شكرا على المدخلات الخاصة بك ، جعلني افكر التي حصلت لي يبحث في أماكن أخرى في القانون ، مما أدى إلى بلدي اه لحظة من التواضع حيث أثبت مرة أخرى الخطأ عادة الإنسان :)

نصائح أخرى

ربما يمكنك محاولة BackgroundWorker المكون.يجعل خيوط أسهل.الأمثلة هنا:

ربما خارج نطاق ولكن في بعض الأحيان من المفيد القيام Application.DoEvents(); لجعل واجهة المستخدم الرسومية أجزاء الاستجابة إلى إدخال المستخدم ، مثل الضغط على زر إلغاء الأمر-على شريط الحوار.

هل هناك أي فرصة تشغيل ويندوز فيستا ؟ لقد لاحظت بالضبط نفس الشيء في بعض تطبيقات الأعمال ذات الصلة.بطريقة ما يبدو أن هناك تأخير عند شريط التقدم "ينعش".

هل أنت متأكد من أن UI يعمل بحرية خلال كل هذه العملية ؟ أيإنه لا يجلس المحظورة-على الانضمام أو الانتظار ؟ هذا ما يبدو لي.

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

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

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

حسنا, أقدر لك ذلك و سعيد لأنك وجدت علة ، ولكن هل نظرت إلى BackgroundWorker?يفعل بالضبط ما تفعله ، ولكن في أزياء موحدة (أيدون الخاصة بك المندوبين) ودون الحاجة إلى إنشاء موضوع جديد - وكلاهما (ربما الصغيرة, ولكن ربما لا تزال مفيدة) المزايا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top