سؤال

لدي بعض كائنات COM التي أقوم بإنشائها وتشغيلها على مؤشرات الترابط في تطبيق .NET.تم وضع علامة على المواضيع على أنها شقق ذات ترابط مفرد، ويبدو أن كل شيء يعمل.ما أفهمه هو أنه إذا حاولت هذه الخيوط الوصول إلى كائنات COM من مؤشر الترابط الرئيسي، فسيتم تنظيم هذه الكائنات تلقائيًا وتسلسلها لي في .NET، لذلك حتى في هذه الحالة سيتم التعامل مع الأمور بالنسبة لي، وكلها آمنة ومرتبة، على الرغم من أنه ربما ببطء قليلا.

سؤالي هو، بينما تبدو الأمور وكأنها تسير على ما يرام، فأنا كذلك لا ضخ حلقة رسائل في سلاسل رسائل STA التي أقوم بإنشائها.أفضل تجنب حلقة الرسائل إذا أمكنني ذلك بسبب المضاعفات الإضافية التي قد تسببها (والخسائر المحتملة في الكفاءة أيضًا).

لقد قرأت مجموعة من النصائح حول سبب أهمية حلقة الرسالة (معظمها من هانز باسانت المفيد جدًا)، وما أفهمه هو أن حلقة الرسالة تعطي مكانًا على مؤشر الترابط A حيث يمكن لبعض مؤشرات الترابط الأخرى B أن تطلب كائنات COM يمكن تنظيم العيش على الخيط A واللعب به.إذا كان هذا صحيحًا، فطالما لم تطلب سلاسل رسائل أخرى أي شيء من كائنات COM في مؤشر الترابط A، فهل يعتبر مؤشر الترابط A آمنًا في عدم ضخ حلقة رسالة؟أم أن هناك حالات أخرى يمكن أن تلعب فيها حلقة الرسائل دورًا أيضًا؟

هل ألعب بالنار هنا؟وهل هناك حالة تسأل فيها إذا كنت تلعب بالنار وأنت لا؟

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

المحلول

يتطلب عقد STA ضخ حلقة رسالة.ولكن نعم، من الممكن الابتعاد عن عدم الضخ.هناك شيئان رئيسيان يمكن أن يحدثا خطأ:

  • لن يتم إكمال أي استدعاء يتم إجراؤه على أسلوب واجهة من جزء آخر، بما في ذلك مؤشر ترابط STA آخر أو مؤشر ترابط في MTA.يبدو هذا وكأنه طريق مسدود في برنامجك، فالمكالمة ببساطة لن تعود أبدًا.احذر من أنه يمكنك التحكم في مكالماتك بشكل جيد ولكنك لا تعرف ما يفعله مكون COM.قد يبدأ الخيط نفسه.يمكنك رؤية ذلك في مصحح الأخطاء باستخدام Debug + Windows + Threads.تأكد من تشغيل مصحح الأخطاء في الوضع غير المُدار وأنه يمكنك حساب كافة سلاسل الرسائل التي تراها.ليس من السهل بشكل خاص راجع للشغل.

  • تعتمد العديد من مكونات COM المترابطة على وجود حلقة رسائل تعتني باحتياجاتها الخاصة.يمكن أن يكون شيئًا غير ضار كمؤقت، ولن يتم تحديده عندما لا تكون هناك حلقة.أو قد يقوم بالتنظيم داخليًا.استخدم Spy++ وتحقق مما إذا كان هناك أي نوافذ مخفية مملوكة لسلسلة STA الجديدة الخاصة بك، علامة أكيدة على وجود مشكلة إذا رأيت واحدة.التشخيص هو الجزء الذي يسيء التصرف.عدم إثارة الأحداث هو حادث مؤسف شائع.

لا يوجد شيء يمكن تثبيته على الحائط عندما لا تعرف ما يكفي عن الأجزاء الداخلية للخادم.تأكد من اختبار هيك للخروج منه.

نصائح أخرى

يمكن تنظيم مكالمات COM بدون حلقة رسالة.

عندما يكون مؤشر ترابط STA الخاص بك في انتظار شيء ما، فإنه في معظم الحالات سيتعامل تلقائيًا مع أي مكالمات COM معلقة.

الوثائق ل الموضوع.انضمام يقول Blocks the calling thread [...] while continuing to perform standard COM and SendMessage pumping.

ويحدث الشيء نفسه بالنسبة للعديد من الوظائف الأخرى التي يتم استدعاؤها نيابةً عنك (CoWaitForMultipleHandles وما إلى ذلك)، على سبيل المثال.عندما يكون مؤشر الترابط الخاص بك في انتظار IO.

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