سؤال

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

كما هو مآمل الظهور، وتخلص طريقة التوقف عن قائمة انتظار الرسائل، ثم ينتظر تعيين مقبض الانتظار الخمول ليتم تعيينه (والتي يجب أن تحدث كحدث receivecmoded عند التخلص منها، ولكن يجب أن تكون الممتلكات E.Message إلا ).

ومع ذلك، تستمر حلقة الرسالة فقط! لقد تم التخلص منها قائمة انتظار الرسائل، لكنها لا تزال تديرها القراءة منه ولا يتم استدعاء معالج الاستثناء، مما يعني أن خط idle.wait ينتظر إلى الأبد.

فهمي هو أن التخلص من قائمة انتظار الرسائل يجب أن تنتهي أي معلقة تلقي واستدعاء الحدث، ولكن يجب على E.Message (أو Q.endreceive) رمي استثناء. أليست هذه الحالة؟ إذا لم يكن الأمر كذلك، فماذا يمكنني الخروج بأمان من حلقة رسالتي؟

شكرا

تحديث:

هنا هو مثال كامل (يفترض أن قائمة الانتظار موجودة) giveacodicetagpre.

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

المحلول 2

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

نصائح أخرى

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

giveacodicetagpre.

.وبعدوبعد giveacodicetagpre.

.وبعدوبعد giveacodicetagpre.

.وبعد.

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