سؤال

أقوم بمعالجة الملفات الكبيرة بعد تحديدها من قبل المستخدم. يبدو رمزي وكأنه ما يلي:

if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

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

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

لسوء الحظ، هذا لا يزال يتجمد تماما UI أثناء معالجة الملف.

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

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
    MessageBox.Show("Sync!");
    // process really big file
}

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

سؤال:

لا يحتوي Silverlight على وظيفة Dections. هل هناك مكالمة يمكنني القيام بها إلى جانب MessageBox.Show للحصول على نفس تأثير مزامنة UI ومنع OpenFiledialog من تضمين UI؟

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

المحلول

استخدم BownWorker لتنفيذ الحساب الثقيل في الخلفية. عندما ترغب في إخطار المستخدم بأن العملية كاملة، يمكن استخدام الحدث Runworkercompleted من الفئة المذكورة أعلاه. البديل لهذا هو استخدام مؤشر ترابط منفصل تماما ثم رد الاتصال على مؤشر ترابط UI باستخدام Probather.begininvoke (). تذكر أنه مع .NET في مؤشر ترابط منفصل لا يمكنك الوصول إلى أي مكونات واجهة المستخدم الرسومية دون هذا النوع من المزامنة.

نصائح أخرى

استخدم فئة BropressWorker لمعالجة ملفك الكبير حقا على مؤشر ترابط الخلفية؟ هنا رابط لك: كيفية: استخدام مخازن المعلومات الأساسية

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