سؤال

أنا أتصفح رموز المصدر من تطبيقين يشاركان قائمة انتظار واحدة باستخدام MSMQ. يحتوي التطبيق الأول على مؤشر ترابط يكتب في قائمة الانتظار بينما يحتوي التطبيق الثاني على مؤشر ترابط آخر يقرأ من قائمة الانتظار. عادة ، إذا كنت تقوم بتنفيذ قائمة الانتظار الخاصة بك ، فإن التطبيقات ستحتاج إلى طعن عند الوصول إلى قائمة الانتظار ، أليس كذلك؟ ومع ذلك ، لم أتمكن من العثور على أي قسم Mutex/Critical في رموز المصدر لهذه التطبيقات. هل فاتني شيء ما؟ أم أن MSMQ لا تحتاج إلى أي طفرات لأنه يتم التعامل معه داخليًا ، هل هناك شيء من هذا القبيل؟

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

المحلول

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

فقط الطرق التالية هي مؤشر ترابط آمنة: BeginPeek ، BeginReceive ، EndPeek (IaSyncresult) ، Endreceive (iasyncresult) ، getAllMessages ، نظرة خاطفة ، وتلقي.

MSMQ.Send () ليس بطبيعته آمن.

إرسال مؤشر ترابط آمن ، طالما أنك ترسل دائمًا كائن رسالة ولا تستخدم أبدًا إرسال كائن .NET مباشرة. يعد استخدام كائن الرسائل ، BTW ، فكرة جيدة دائمًا - لأنه يتيح لك إضافة تسمية ، مهلة ، خيار قابل للاسترداد وكل هذه الأشياء التي تجعل حل MSMQ الخاص بك حلًا حقيقيًا للمؤسسة.

class Program
{
    static MessageQueue outQueue;
    static void Main(string[] args)
    {
        outQueue = new MessageQueue(@".\private$\mtQueue"); 

        for (int i = 0; i < 100; i++)
        {
            Thread thr = new Thread(new ThreadStart(MyThreadProc));

            thr.Start();
        }
    } 

    static void MyThreadProc()
    {
        Message msg = new Message();
        for (int i = 0; i < 100; i++)
        {
            msg.Label = string.Format("{0} : {1}",
                                     Thread.CurrentThread.ManagedThreadId,
                                      i);
            outQueue.Send(msg);
        }
    }
}

من عند: هل إرسال () موضوع آمن؟

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