سؤال

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

ونموذج التي تتولى-اختيارات المستخدم، ولديه IList<T> حيث T هو كائن المحلية، Step، الذي ينفذ INotifyPropertyChanged، وذلك في واجهة المستخدم هي التي شنت هذا على لداتاغريدفيف. كل شيء على ما يرام في وقت التشغيل، وينعكس على الحالة الأولية من الكائنات على الشاشة.

وكل الكائنات Step مهمة التي يتم تنفيذها في المقابل، بعض من خصائص وتغيير، تنعكس إلى IList وتنتقل إلى داتاغريدفيف.

ويتم هذا الإجراء في الإصدارات UI عن طريق إنشاء BackgroundWorker رفع الأحداث إلى واجهة المستخدم. وStep يفعل شيء ويولد كائن StepResult وهو نوع سردي تشير للنتائج (مثل الجري، NotRun، OK، NotOK، التحذير) وسلسلة للإشارة إلى رسالة (لأن الخطوة ركض ولكن ليس تماما كما توقعت، أي مع تحذير). عادة الإجراءات سوف تنطوي على التفاعل قاعدة البيانات، ولكن في وضع التصحيح I تولد عشوائيا نتيجة لذلك.

إذا كانت الرسالة فارغة، وهناك أبدا مشكلة، ولكن إذا كنت توليد استجابة مثل هذا:

StepResult returnvalue = new StepResult(stat, "completed with caveat")

وأحصل على خطأ قائلا ان داتاغريدفيف ويتم الوصول إليها من موضوع آخر غير موضوع تم إنشاؤه على. (أنا تمرير هذا من خلال معالج مخصص التي ينبغي التعامل مع الاستناد عند الاقتضاء - ربما لا)

وبعد ذلك إذا كنت توليد استجابة فريدة من نوعها، على سبيل المثال، باستخدام عدد r عشوائي:

StepResult returnvalue = new StepResult(stat, r.ToString());

والإجراءات تنجح مع أي مشكلة، يتم كتابة أرقام نظيفة لداتاغريدفيف.

وأنا في حيرة. أفترض انها الى حد ما مشكلة الحرفية سلسلة، ولكن يمكن لأي شخص أن يأتي مع شرح أكثر وضوحا؟

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

المحلول

ومنذ تقومون به UI ملزمة من خلال الاشتراك الحدث، <وأ href = "http://groups.google.co.uk/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/214e55884b16f4d9/f12a3c5980567f06# f12a3c5980567f06 "يختلط =" نوفولو noreferrer "> قد تجد هذا مفيدة. هو مثال كتبته قبل فترة من الوقت الذي يظهر كيفية فرعية BindingList<T> بحيث يتم تنظيمها الإخطارات إلى موضوع UI تلقائيا.

إذا لم يكن هناك المزامنة السياق (أي وضع وحدة التحكم)، ثم يعود مرة أخرى إلى الاحتجاج المباشر بسيطة، لذلك ليس هناك سماء المنطقة. عند التشغيل في موضوع UI، لاحظ أن هذا يستخدم أساسا Control.Invoke، التي تدير نفسها مجرد مندوب مباشرة إذا كان على موضوع UI. حتى لا يكون هناك أي تبديل فقط إذا كان يتم تحرير البيانات من موضوع عدم UI - ناتئة ما نريد ؛-p

نصائح أخرى

ولقد أجاب لكم quesion الخاصة: -

<اقتباس فقرة>   

وأحصل يقولون خطأ أن داتاغريدفيف ويتم الوصول إليها من موضوع آخر غير موضوع تم إنشاؤه على.

وWinForms عناصر يصر على أن جميع الإجراءات التي يتم تنفيذها على أشكال والضوابط تتم في سياق موضوع تم إنشاء النموذج في، والسبب في ذلك هو معقد، ولكن لديها الكثير لتفعله مع API Win32 والكامنة. لمزيد من التفاصيل، راجع مقالات مختلف على rel="nofollow القديمة الشيء الجديد بلوق.

ما عليك القيام به هو استخدام InvokeRequired واستدعاء أساليب للتأكد من أن الضوابط يتم الوصول إليها دائما من نفس موضوع (pseudocodeish):

object Form.SomeFunction (args)
{
  if (InvokeRequired)
  {
    return Invoke (new delegate (Form.Somefunction), args);
  }
  else
  {
    return result_of_some_action;
  }
}

وكان لي نفس هذه المشكلة من قبل. ربما هذه المادة نشرت لي حول هذا الموضوع يمكن أن تساعد.

HTTP: //cyberkruz.vox كوم / مكتبة / آخر / صافي-مشكلة المتزامن والنوافذ، forms.html

ولقد وجدت هذه المادة - "<في أ href =" http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/186338b6-2fe1-4d41-bab5-c35bf64a6b8d/ "يختلط =" نوفولو noreferrer "> تحديث IBindingList من موضوع مختلف " - الذي أشار بأصابع الاتهام إلى BindingList -

<اقتباس فقرة>   

ولأن BindingList ليس الإعداد لعمليات المتزامن، يجب تحديث BindingList من الخيط نفسه الذي كان يسيطر عليه.

ويمر صراحة النموذج الأصل ككائن ISynchronizeInvoke وخلق مجمع لBindingList<T> لم الحيلة.

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