سؤال

لدي شيء يبدو لي مثل حالة السباق أثناء تسجيل الملفات من مؤشر ترابط متعددة.

1) لدي فئة مسجل مخصصة (ConfigenableTraCelogger) التي تتم مشاركتها بواسطة مؤشرات ترابط متعددة في طلبي. لديها الكثير من الوظائف المجمع التي تتصل جميعها بالعمل الرئيسي

protected void TraceData(String category, TraceEventType type, EventId id, string prefix, string format)
{
    foreach (TraceListener item in _listeners)
    {
        IConfigurableTraceListener cl = item as IConfigurableTraceListener;

        if (cl != null && cl.Category == category.ToLower())
        {

            if (DisplayMethodName)
                item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);
            else
                item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, format);

            item.Flush();
        }
    }
}

كما ترون صفي ببساطة تخزين فئة مختلفة محذمة من Tracelistern في مجموعة _ Alisteners. في الأساس لا توجد سوى مستمعين وحدة التحكم والنصوص. ما هي Tracedata التي يستغرقها اسم الفئة (أي بدء تشغيل التسجيل) ويجد المستمع الأيمن. يتم تعريف جميع المستمعين بواسطة اسم ملف التكوين

الآن لدي أيضا مستمعي المخصص في المجموعة

public class ConfigurableTextWriterTraceListener : TextWriterTraceListener, IConfigurableTraceListener

يتجاوز الفئة المخصصة أي شيء باستثناء خاصية واحدة.

protected override string[] GetSupportedAttributes()
{
    return new string[] { "category" };
}

عندما أبدأ طلبي بعد 5 إلى 10 دقائق، أحصل على استثناء على المكالمة

           item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);

استثناء يقول:

"تم اكتشاف حالة سباق الإدخال / الإخراج المحتملة أثناء نسخ الذاكرة. حزمة الإدخال / الإخراج ليست مؤهلة بشكل افتراضي. في التطبيقات متعددة المراحل، يجب الوصول إلى دفق في طريقة آمنة للخيط، مثل Wrapper الآمن للخيط عاد بواسطة Textreader أو طرق متزامنة TextWriter. هذا ينطبق أيضا على الفصول مثل StreamWriter و StreamReader. "

بعد ذلك، استمر في الحصول على الكثير من المرات في نفس المكالمة

item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);

استثناء

العدد لا يمكن أن يكون أقل من الصفر. اسم المعلمة: العد تتبع المكدس System.diagnostics.textritterstractracelistener.write (رسالة سلسلة) r n في system.diagnostics.tracelistener.writeheader (مصدر السلسلة، traceeventtype eventtype، INT32 معرف) r n في system.diagnostics.tracelistener.tracedata (Traceevevache EventCache، String المصدر، Traceeventtype EventType، ID32 معرف، بيانات الكائنات) r n في JFCronfigurAracelogger.tracedata (فئة السلسلة، نوع TraceeventType، معرف EventID، بادئة السلسلة، تنسيق السلسلة، كائن [] Args [] Args) "

يبدو لي أن صفي ليس مؤمنا أيضا دعوة إلى Tracedata. لكن configurabletextwitterTracelistener يقال للخيط آمن بعد كل شيء. ومع ذلك، فقد راجعت Isthreadsafe Protety للحصول على TextWritterTracelistener المستمدة من فئة Run-Time و False. أحاول معرفة أين المشكلة هي.

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

المحلول

وهذا يعني ما يقول - tracelistener الخاص بك ليس آمنا وخيط فواصل عند الوصول إليها من العديد من المواضيع. تحتاج إلى جعل موضوع المستمعين الخاص بك آمن أو العثور على وسيلة للتأكد من أن مؤشر ترابط واحد فقط يصل إلى أي مثيل معين.

إحدى الطرق لجعلها مؤكهة الخيط هي استخدام قائمة انتظار متزامنة وجعل جميع مكالماتك عناصر بيانات Enquueue إلى قائمة الانتظار أثناء قيامهم "حقيقي" Tracelistener إليهم ويكتبهم في مؤشر ترابط منفصل.

يجب عليك أيضا أن تكون حذرا مع قاموس المستمعين الخاص بك - تحديث القاموس غير آمن، ولكن إذا لم يتمكن أبدا من الوصول إليه قبل تطبيق التحديث الأخير، فيمكنك تركه كما هو

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