سؤال

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

لقد قمت في البداية بتنفيذ حل يعتمد على هذا المقال.ومع ذلك، يتطلب هذا أن يكون الشخص الذي يقوم بتنفيذ الخادم قيد التشغيل قبل العميل.

ما هي أفضل طريقة لتنفيذ نوع ما من الإشعارات للخادم عند تشغيل العميل (العملاء) أولاً؟

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

المحلول

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

إذا انتقلت إلى المسار البعيد، فيمكنك استخدام IpcChannel بدلاً من قنوات TCP أو HTTP لاتصال نظام واحد باستخدام Named Pipes. http://msdn.microsoft.com/en-us/library/4b3scst2.aspx.تكمن المشكلة في هذا الحل في أنك ستحتاج إلى التوصل إلى حل لنوع التسجيل (إما في الذاكرة المشتركة أو في بعض المتاجر الدائمة الأخرى) التي يمكن للعمليات تسجيل نقاط النهاية الخاصة بها بها.وبهذه الطريقة، عندما تبحث عنها، يمكنك العثور على طريقة للاستعلام عن جميع نقاط النهاية التي تعمل على النظام ويمكنك العثور على ما تبحث عنه.تتمثل فوائد استخدام الاتصال عن بعد في أن التسلسل واستدعاء الأسلوب كلها واضحة ومباشرة.وأيضًا، إذا قررت الانتقال إلى أجهزة متعددة على الشبكة، فيمكنك فقط الضغط على المفتاح لاستخدام قنوات الشبكة بدلاً من ذلك.تتمثل السلبيات في أن الاتصال عن بعد يمكن أن يصبح محبطًا ما لم تفصل بوضوح بين المكالمات "البعيدة" والمكالمات "المحلية".

لا أعرف الكثير عن WCF، ولكن قد يكون من المفيد أيضًا البحث فيه.يقول Spider Sens أنه من المحتمل أن يكون لديه حل أكثر أناقة لهذه المشكلة...ربما.

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

شيء آخر يجب النظر فيه في نموذج النشر والاشتراك للأحداث (Pub/Sub).تساعد هذه التقنية عندما يكون لديك مستمع يتم تشغيله قبل أن يتوفر مصدر الحدث، ولكنك لا تريد الانتظار للتسجيل في الحدث.ستتعامل عملية "الخادم" مع سجل الأحداث لربط الناشرين والمشتركين.

نصائح أخرى

لماذا لا نستضيف الخادم والعميل من كلا الجانبين، ومن يأتي أولاً يصبح الخادم؟وإذا انقطع الخادم، يقوم العميل الذي لا يزال نشطًا بتبديل الأدوار.

هناك العديد من الطرق للتعامل مع IPC (.net أم لا) وعبر نفق TCP/HTTP هي إحدى الطرق... ولكنها يمكن أن تكون خيارًا سيئًا للغاية (اعتمادًا على الظروف والبيئة).

تعد الذاكرة المشتركة والأنابيب المسماة طريقتين (ونعم يمكن إجراؤهما في .Net) وقد تكونان حلولاً أفضل بالنسبة لك.هناك أيضًا فئة IPC في .Net Framework...لكنني شخصيًا لا أحبها بسبب بعض مشكلات AppDomain...

وأنا أتفق مع جارو.

سيكون استخدام خدمة الحانة/الفرعية حلاً رائعًا.من الواضح أن هذا يعني أن هذه الخدمة يجب أن تكون جاهزة للعمل قبل أي من الخدمتين الأخريين.

إذا كنت تريد تخطي pub/sub، يمكنك فقط تنفيذ الخدمة في كلا التطبيقين بنقاط نهاية مختلفة.عند تشغيل أي من التطبيقات فإنه يحاول الوصول إلى الكائن المعروف الآخر عبر وكيل IPC.إذا فشل الوكيل، فلن يتم تشغيل الكائن الآخر.

-سكوت

لقد أمضيت يومين في التجول بين جميع الخيارات المتاحة لـ IPC بينما كنت أبحث عن طريقة موثوقة وبسيطة وسريعة للقيام بتقنية IPC ثنائية الاتجاه. IPCLibrary, ، الذي وجدته على موقع Codeplex.com، يعمل حتى الآن بشكل مثالي من بين جميع الخيارات التي جربتها.كل ذلك مع 7 أسطر فقط من التعليمات البرمجية.:D إذا تعثر أي شخص في هذا أثناء محاولته العثور على IPC مزدوج الاتجاه، فوفر على نفسك الكثير من الوقت وقم بتجربة هذه المكتبة.احصل على الكود المصدري، وقم بتجميع ملف data.dll واتبع الأمثلة المقدمة.

HTH ، سيرك

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