WCF :: ServiceHost: الغريب ... لا يزال حيا حتى لو كان الموضوع ميتا؟

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

سؤال

عضو جديد هنا. جميل أن نرى مثل هذه المجتمع أنيق.

بعد القليل من الأبحاث، قررت استخدام WCF في طلبي للقيام باتصال العملية، لذلك أنا أستخدم ربط NetNamedPipeIbinding.

تطبيق استضافة ServiceHost ليس خادم مخصص، لذلك يجب أن تفرخ ServiceHost عبر مؤشر ترابط. حتى الان جيدة جدا.

لذلك لدي شيء مثل ما يلي:

Foo()
{
    Thread serverThread = new Thread(new ThreadStart(ServerThread));
    serverThread.Start();
    Console.WriteLine("Foo Exited");
}

ServerThread()
{
   Uri baseAddress = new Uri("net.pipe://localhost/service");
   ServiceHost serviceHost = new ServiceHost(typeof(MyService), baseAddress);
   ...
   serviceHost.Open();
   Console.WriteLine("Server Thread Exited");
}

وذلك كما هو متوقع، أرى:

->   Server Thread Exited
->   Foo Exited

ولكن إلى مفاجأة، على الرغم من أن الخماس الذي يعمل عليه الخادم هو متحمس، فلا يزال بإمكان العميل الاتصال ب ServiceHost وعمليات المضيف للخدمة طلب الطلب بشكل صحيح!

إذن كيف لا تزال ServiceHost معالجة وعلاج الطلبات على الرغم من أن مؤشر الترابط الرئيسي (الذي تم إنشاؤه عليه) قد مات؟

هل هناك أيضا طريقة أفضل للحفاظ على ServerThread على قيد الحياة ثم حين (صحيح) {موضوع. النوم (100)؛}؟

شكرا.

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

المحلول

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

قد لا يكون ذلك ضروريا في قضيتك لتفرخ حول موضوع نفسك. ما عليك سوى فتح الخدمة الخاصة بك في مؤشر الترابط الرئيسي للتطبيق. يمكنك بعد ذلك القيام بأشياء أخرى في مؤشر ترابطك الرئيسي، وعندما تكون مستعدا لقتل المضيف، ما عليك سوى استدعاء ServiceHost.Close ().

إليك وصف جيد جدا وجدت:

http://www.code-magazine.com/article.aspx؟quickid=0701041&page=1.

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