سؤال

ولدي مشكلة متقطعة مع بعض التعليمات البرمجية التي يكتب إلى سجل الأحداث ويندوز، وذلك باستخدام C # و الطبقة EventLog صافي و.

وأساسا، هذا الرمز يعمل يوما بعد يوم تماما، ولكن في بعض الأحيان للغاية، ونحن نبدأ أخطاء الحصول على مثل هذا:

<اقتباس فقرة>   

و"System.ArgumentException: فقط   الأحرف الثمانية الأولى من سجل مخصصة   اسم هم كبير، وهناك   بالفعل سجل آخر على النظام   باستخدام الأحرف الثمانية الأولى من   اسم معين. اسم معين:   'تطبيق'، اسم السجل الموجود:   'تطبيق'. "

ويمكنني تحديد من معلومات أخرى عن السجلات في أن مكدس الاستدعاءات المتضررين هو من هذا القبيل - يمكنك أن ترى بوضوح أنا في الواقع محاولة الكتابة إلى سجل LB_Email القائمة (يسمى LogEmail أولا):

public static void LogEmail(string to, string type)
{
    string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
    Log(message, "LB_Email", EventLogEntryType.Information);
}

private static void Log(string message, string logName, EventLogEntryType type)
{
    using (EventLog aLog = new EventLog())
    {
        aLog.Source = logName;
        aLog.WriteEntry(message, type);
    }
}

وبمجرد أن تبدأ الأخطاء التي تحدث، يبدو أن الحصول على لدينا سجل أحداث LB_Email مقفل بطريقة أو بأخرى - عرض خصائص في سجل أحداث معين يظهر معظم المعلومات الرمادي المغادرة وغير قابلة للتغيير، وتظهر عمليات أخرى لمنعه من تسجيل الدخول الى أن سجل أيضا. ومع ذلك، أرى الخطأ (والذي يستخدم نفس الأسلوب دخول أعلاه) عبر محاولة اللحاق بتسجيل إلى سجل "LB_Error"، والتي لا تزال تعمل كما هو متوقع.

وأنا أدعو هذا الرمز من تطبيق متعددة الخيوط، ولكن لقد كنت غير قادر على تحديد إذا كان رمز أعلاه هو الخيط آمنة أم لا.

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

وأنا أحب أن أسمع الأفكار والاقتراحات الخاصة بك.

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

المحلول

الوثائق تنص على ما يلي:

<اقتباس فقرة>   

ويمكنك فقط استخدام المصدر لكتابة   لسجل واحد في وقت واحد

وهكذا أظن هو سبب هذه المشكلة عن طريق التطبيق الخاص بك مؤشرات استدعاء الأسلوب Log أكثر من مرة واحدة في وقت معين ولنفس المصدر.

وأقترح أنه بدلا من فئة ثابتة (أو الطرق)، يمكنك استخدام فئة المفردة ذات ألوان لتسجيل هذه الأحداث.

وتحرير:

وجون السكيت لديه ممتاز المقالة على سنغلتونس.

إذا كنت لا تريد تطبيق فئة المفرد يمكنك أن تفعل شيئا من هذا القبيل:

    static readonly object lockObj = new object();

    public static void LogEmail(string to, string type)
    {
        string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
        Log(message, "LB_Email", EventLogEntryType.Information);
    }

    private static void Log(string message, string logName, EventLogEntryType type)
    {
        lock (lockObj)
        {
            using (EventLog aLog = new EventLog())
            {
                aLog.Source = logName;
                aLog.WriteEntry(message, type);
            }
        }
    }

وهذا الأمل يحل مشكلتك.

نصائح أخرى

وبفضل برونو،

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

حسنا، لدي عدة طرق المجمع إلى سجل (...) الأسلوب. إذا انتقلت طريقة دخول إلى طبقة مفردة، غير مغلفة (LogEmail، LogXxxx، LogYyy الخ ثم أتمكن من إبقاء بلدي Log.Zzzz واجهات نفسه، ولكن الاستفادة من أمن المفرد LogSingleton.Instance.Log (...) من سجلات الحالية. OR لأنني أريد أن أكتب إلى سجلات مختلفة، فإن كل واحد تتطلب LogSingletonXxx تلقاء نفسها؟

ويمكنك أن تقول أنا الخلط :) نعم - كنت حقا نقدر بعض التعليمات البرمجية التزامن:)

ونيج

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