سؤال

حسنا، لدي فئة ثابتة لها عضوين ثابتان وسلسلة ومنطقية.
تقوم طريقة ثابتة عامة بتسمية القيم لهؤلاء الأعضاء بناء على حالة المعلمات التي تم تمريرها.

ثم يتم استدعاء طريقة ثابتة خاصة التي تعالج الأعضاء الثابتة.

المشكلة هي أنه في حين أن المنطقي يحافظ على القيمة التي يتم تعيينها في الوظيفة العامة، فإن السلسلة لا؛ تعود إلى القيمة النهائية لها. لماذا هذا؟
رمز مبسط أدناه.

static class MessageHandler
{
    private static String m_messageToSend = String.Empty;
    private static bool m_requiresACK = false;


    public static void Send(String message)
    {
         //formatting etc (actual method sets more fields)
         m_messageToSend = message;
         m_requiresACK = true;

         Send();
    }

    private void static Send()
    {
        SendMessageDelegate sendDelegate = DoSend;
        //At this point m_requiresACK remains true but m_messageToSend does not 
        //hold value of message; it is empty.
        IAsyncResult ar = sendDelegate.BeginInvoke(m_messageToSend, m_requiresACK);


        //rest of function
    }
}

//some other class
MessageHandler.Send("Hello");
هل كانت مفيدة؟

المحلول

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

static class Message
{
    public static void Send(String message)
    {
         Send(message, true);
    }

    private void static Send(string messageToSend, bool requiresACK)
    {
        SendMessageDelegate sendDelegate = DoSend;
        IAsyncResult ar = sendDelegate.BeginInvoke(messageToSend, requiresACK);

        //rest of function
    }
}

نصائح أخرى

هذا على الأرجح بسبب استدعاء موضوع آخر

Message.Send("");

أو يتم تفريغ AppDomain الخاص بك. دون مزيد من المعلومات، من الصعب القول بالتأكيد.

لديك بعض مشاكل سلامة الخيط الضخمة هناك. إذا كنت تريد حقا هذا الثابت، فهناك إصلاح صفيق:

[ThreadStatic]
private static String m_messageToSend = String.Empty;
[ThreadStatic]
private static bool m_requiresACK = false;

هذا يعمل الآن ثابتا، لكنه موضوع. وبعد تفادت الأزمة؛ ولكن هذا قليلا ... حسنا، سأحاول تجنب الحاجة، نفسي - لكنه سيعمل بشكل جيد.

الأهمية: المهيئون لكل موضوع، وليس حسب الطلب؛ نظرا لأنه من المحتمل أن يتم إعادة استخدام المواضيع الخاصة بك، يجب عليك التأكد من تهيئة الحالة قبل محاولة استخدامها، أو يمكنك الحصول على القمامة القديمة.

سأكون مندهشا جدا إذا كان هناك حقل واحد سيحتفظ بنفس القيمة، والآخر لم يفعل ذلك.

إذا كان هذا تطبيق ويب، فيمكن أن يحدث هذا إذا تم إعادة تدوير التطبيق.

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

اكتب اختبار وحدة أو تسخير اختبار بسيط يسمى رسالة .send ("Hello World")؛ ويفير تأكيدا على الإخراج. عزل هذا من CodeBase المكالمات الخاص بك يمكن أن يلمع الضوء على ما إذا كان فئة رسالتك التي تتصرف بشكل غير طبيعي، أو إذا كان مستهلك يرسل بيانات سيئة / غير متوقعة.

أيضا، ما لم يكن لديك // ما تبقى من الوظيفة تتضمن إعادة ضبط BOOL، فسيكون ذلك صحيحا دائما بعد إرسال الرسالة الأولى.

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