سؤال

لدي خدمة WCF مستضافة ذاتيًا وأواجه المشكلة التالية: بعد 15 دقيقة من إنشاء مثيل مكالمات Tryenter للخدمة في أساليب عقد التشغيل ، تُرجع باستمرار كاذبة ، لكن مكالمات Tryenter في الوظيفة الرئيسية ، والتي تستخدم أيضًا التزامن عبر الشاشة الفصل ، العودة صحيح.

فيما يلي وصف لتطبيقي والخطأ: أقوم بتطوير خدمة WCF مستضافة ذاتيًا في Visual Studio 2008 (C#) في Windows XP SP2. يتم إنشاء مثيل Servichost للمضيف في بداية الوظيفة الرئيسية. تدير الوظيفة الرئيسية حلقة (حقيقية) التي تؤدي خلالها قراءات دورية ، والكتابة ، والصيانة ، إلخ. تقوم بعض هذه المواضيع بعمل دوري تطلبه الوظيفة الرئيسية ، بينما يقوم الآخرون بالقراءة والكتابة عند الطلب إلى جهاز بعيد. يتم قفل المزامنة على هذه الكائنات باستخدام فئة الشاشة (طرق التجريب والخروج). يتم الوصول إلى هذه الكائنات أيضًا من خلال أساليب عقد الخدمة (الخدمات) باستخدام نفس الوظائف. يتم التزامن بين الوظيفة الرئيسية وطرق الخدمة. عند إنشاء مثيل الخدمة ، يتم تشغيله بأداء مصمم لمدة 15 دقيقة بالضبط ، وبعد ذلك ، تُرجع كل من Tryenter (OBJ ، Timeout) المصنوعة من الخدمة False بعد انتهاء المهلة المحددة. ومع ذلك ، فإن هذا لا يؤثر على مكالمات التجرب التي تم إجراؤها في الوظيفة الرئيسية ، أي أنها تعود دائمًا إلى حد ما. لقد حاولت تغيير الإعدادات لـ InstancecontextMode ، و concurrencymode ، إلى جانب سمات خنق الخدمة maxconcurrentCalls = "1" ؛ MaxConcurrentSessions = "5" وكل تكوين أعطى نفس التأثير. تصبح الخدمة مستجيبة مرة أخرى عندما أقوم بإعادة تشغيل التطبيق المضيف ، ولكن ليس عندما أغلق المضيف وقوة أعيد فتحه أثناء تشغيل التطبيق (يبقى مثيل الخدمة في الذاكرة). إنها ليست حالة خدمة غير متوفرة ، كما هو الحال في المكالمة التي لا تشق طريقها إلى مثيل الخدمة. تسمى هذه الطريقة ، ويأتي تنفيذها إلى مكالمة Tryenter التي تسبق القسم الحرج من الطريقة و Tryenter يعيد مجرد خطأ بعد المهلة (15 ثانية). لقد قمت بفحص وفحص مزدوج إقران Tryenter والخروج - الأساليب تطلق دائمًا القفل عند انتهاء القسم الحرج. تعمل عمليات العقد الأخرى التي لا تستخدم القفل أو تعمل الكائنات المعنية بشكل جيد حتى بعد انتهاء فترة 15 دقيقة.

شكرا لكم جميعا مقدما. اجازة سعيدة!

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

المحلول

Monitor إعادة إدخال ، لذلك يبدو مثل الخيط الخاص بك Main لقد فشلت الطريقة في إطلاق قفل. لذلك عندما يسأل عن القفل (TryEnter) يحصل على القفل (زيادة العداد بواسطة اخر واحد).

سيتم رفض جميع المواضيع الأخرى. ستحتاج إلى تصحيح المكان الذي يتم فيه أخذ القفل والاحتفاظ به.

لقد قمت بفحص وفحص مزدوج إقران Tryenter والخروج - الأساليب تطلق دائمًا القفل عند انتهاء القسم الحرج

آسف ، لكنني أعتقد أنك ستتحقق من ثلاثة أضعاف. على وجه الخصوص ، على عكس lock, TryEnter لن يكون لديك أي استثناء خاص معالجة. يجب أن يبدو الرمز الخاص بك مثل:

if(Monitor.TryEnter(lockObj, timeout)) {
    try {
        ...
    } finally {
        Monitor.Exit(lockObj);
    }
}

أيضا - تأكد من أنك لا تفعل قم بإعادة الأسنان لك lockObj في الكود ، لأن هذا لن يفتح الكائن الصحيح.

(أو ما شابه ذلك باستخدام العلم ، وخاصة في .NET 4.0 حيث هناك أحمال زائدة جديدة إلى عن على Enter إلخ)

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