سؤال

هل يجب علي قفل الوصول إلى أعضاء المثال؟

مثال:

public class HttpModule : IHttpModule
{
    //...

    Dictionary<int, int> foo;

    void UseFoo(int a, int b)
    {
        foo[a] = b;
    }
}
هل كانت مفيدة؟

المحلول

ليس واضحًا بالنسبة لي بعيدًا عن وثائق MSDN ، لكنني وجدت أ منشور المنتدى من شخص يدعي أنه يعرف الإجابة. يبدو أنك لا يجب أن تتوقع اشياء سيئة سيحدث مع تطبيقك ، ولكن يجب أن تدرك ذلك fooلن تتم مشاركة حالة ما في جميع النتائج منذ ذلك الحين منذ HttpModule سيتم إنشاء مرة واحدة لكل HttpApplication أن IIS يختار أن تبقي في حمام السباحة.

نصائح أخرى

أردت أن أقدم هنا النتائج التي توصلت إليها تتعلق بهذا السؤال كما لاحظت في IIS6:

لقد كنت أتعامل مع هذه المشكلة على نطاق واسع في IIS6 ووجدت بعض النتائج المثيرة للاهتمام باستخدام Log4Net والانعكاس لالتقاط تاريخ التنفيذ. ما وجدته هو أن هناك "إدارة خيوط" واسعة النطاق تحدث وراء الكواليس. يبدو أن هناك سلسلة "أساسية" من الخيوط التي تتوافق مع 1: 1 HttpApplication. ومع ذلك ، فإن هذه المواضيع لا تتعامل بشكل حصري لخط الأنابيب لطلبك. مختلف الخيوط الفرعية تستطيع يتم استدعاؤها عند الوصول إلى هذه الحالات. يبدو أن الطلبات وطلبات الموارد الجديدة اللاحقة التي تستخدمها التطبيق الخاص بك تشترك في بعض المعلومات المستمرة المتعلقة بطلبك الأصلي ولكن لا يتم التعامل معها بالكامل بواسطة الخيط الأولي الذي يشير إلى نوع من العلاقة. لم أستطع تمييز أي نمط ملموس (بخلاف ما وصفته سابقًا) فيما يتعلق بالعناصر التي تم تقسيمها إلى خيوط أخرى لأنها كانت عشوائية على ما يبدو. استنتاجي لهذا الدليل هو أن هناك مفهومًا لتجميع التسلسل الهرمي؟ تحدث حيث يتم توريث بعض العناصر الفرعية غير المعروفة من العناصر المرجعية في خيوط الطفل من خلال مرجع الوالدين.

لذلك كإجابة أود أن أقول ذلك HttpModules نكون مشترك بين المواضيع. فيما يتعلق بقيم القفل ، سيكون هذا قابلاً للتطبيق إذا تم تطبيق القيم على جميع الطلبات التي تستخدم الوحدة ويجب الحفاظ على بعض الحالة. يمكن أن أرى أن هذا مفيد إذا كنت أحاول الحفاظ على قيم المثيلات المفعمة بالحيوية والتي تكون مكلفة للتأكد من إعادة استخدامها في الطلبات اللاحقة.

كانت هذه المشكلة تزعجني لبعض الوقت على أمل أن تساعد هذه المعلومات شخصًا ما.

لقد وجدت مؤخرًا مقالًا يمس هذا السؤال قليلاً:http://www.dominicpettifer.co.uk/blog/41/ihttpmodule-gotchas ---The-init-method-can-get-call-multiple-times

لا يذكر المواضيع ، ولكن يقول فقط أن عملية العمال سوف

قم بتثبيت العديد من كائنات httpapplication كما تعتقد أنها تحتاجها ، ثم ستجمعها لأسباب الأداء ، وإعادة استخدام مثيلات مع ظهور طلبات جديدة قبل إرسالها إلى التجمع.

باتباع الرمز من الرابط ، يمكنك التأكد من تنفيذ رمز init الخاص بك مرة واحدة بطريقة آمنة مؤشرات الترابط:

private static bool HasAppStarted = false; 
private readonly static object _syncObject = new object(); 

public void Init(HttpApplication context) 
{ 
    if (!HasAppStarted) 
    { 
        lock (_syncObject) 
        { 
            if (!HasAppStarted) 
            { 
                // Run application StartUp code here 

                HasAppStarted = true; 
            } 
        } 
    } 
}

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

المقالة التي نشرها جيم مثيرة للاهتمام ، ولكن كما يقول جيم إنه لا يذكر أي شيء عن سلامة الخيط.

أعتقد أنك ستحتاج فقط إلى آلية القفل إذا كنت تقوم بتهيئة الأعضاء الثابتة أو تنفيذ التهيئة "مرة واحدة فقط" ، أي تهيئة مورد ثابت.

لم أستطع أن أختتم من MSDN ولا المقال الذي ذكره جيم بأننا بحاجة إلى آلية القفل عند تهيئة متغيرات الطبقة غير الستنية.

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