هل عمل الحدث Application.ApplicationExit أن يتم إعلامك الخروج في تطبيقات غير WinForms عناصر؟

StackOverflow https://stackoverflow.com/questions/529867

سؤال

مكتبة رمز لدينا يجب أن يتم إعلامك عند إنهاء التطبيق. وبذلك نكون قد اشتركت في هذا الحدث System.Window.Forms.Application.ApplicationExit. هذا يعمل بشكل جيد للتطبيقات WinForms عناصر، ولكنه يعمل أيضا لأنواع أخرى من التطبيقات مثل التطبيقات وحدة التحكم، والخدمات، وتطبيقات الويب (مثل ASP.NET)؟ ان مساحة تشير إلى أن لم يحدث ذلك، ويفترض أن يحصل أثار عندما يتم استدعاء Application.Exit() (صراحة أو implictly)، والتي قد لا تكون صحيحة للدعوة لهذه الحالات الأخرى.

هل هناك حدث آخر من شأنه أن يكون أفضل في هذه الحالات الأخرى أو التي من شأنها أن تكون أكثر عالمية (كبيرة اذا كان يعمل لWinForms عناصر، أيضا)؟ على سبيل المثال، هناك حدث عن عندما يتم استدعاء Environment.Exit() (التطبيق وحدة)؟

ولقد وجدت إشارة حدث خرجت في System.Diagnostic.Process، ولكن يبدو أن هذا لرصد خروج <م> آخر العملية، وأنه لا يبدو أن تتلقى عملية حول نفسها (على سبيل المثال، Process.GetCurrentProcess().Exited += Process_Exited; Process.GetCurrentProcess().EnableRaisingEvents = true;). وأود أن أعتقد أنه قد تثار إلا بعد العملية قد خرجت فعلا، بحيث لن يجدي نفعا.

وهذا هو على وجه الخصوص ل. NET 2.0 و C #.

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

المحلول

ولقد وجدنا في النهاية المزيد عن هذا (ولكن بحلول ذلك الجهاز الخاص بي قد تم بناؤها وخسر الكوكيز لملفي الشخصي غير مسجل هنا، ونأمل، وسوف تتيح آخر التقى هذا الجواب).

ومزيد من التحقيقات وجدت في نهاية المطاف بضعة الأحداث التي وجدنا مفيدة:

وSystem.Windows.Forms.Application.ThreadExit - حرائق عند مخارج حلقة رسالة System.Windows.Forms.Application.ApplicationExit - حرائق عندما حلقات كل رسالة الخروج System.AppDomain.CurrentDomain.DomainUnload - حرائق عندما مجال آخر غير مخارج الافتراضي System.AppDomain.CurrentDomain.ProcessExit - حرائق عندما يتم إنهاء مجال التطبيق الافتراضي System.AppDomain.CurrentDomain.UnhandledException - حرائق عند حدوث استثناء uncaught، وإنهاء التطبيق

واحد فقط من DomainUnload أو ProcessExit الأحداث ممكنة لمجال التطبيق معينة، اعتمادا على ما إذا كان هو الافتراضي (المستوى الأعلى) المجال لعملية أو تم إنشاؤها كما فرعي (على سبيل المثال على خادم الويب). إذا كان الطلب لا تعرف ما قد يكون (كما في حالتنا)، فإنه يحتاج إلى الاشتراك في كلا اذا كانت تريد للقبض على تفريغ الفعلي لنفسها. أيضا، يبدو أن UnhandledException (والتي اعتبارا من .NET2.0 غير قاتلة دائما) قد منع اثنين من الأحداث الأخرى، بحيث قد يكون حالة ثالثة في التعامل معها. يجب أن تعمل هذه الأحداث الثلاثة لأي تطبيق .NET.

وهناك التحذير من أن وقت التنفيذ لProcessExit يحدها (حوالي 4 ثواني)، لذلك قد لا يكون من الممكن القيام واسعة النطاق "النهائي" العمل في ذلك معالج الحدث. فإنه يجب أن يكون الشيء الذي يمكن القيام به بسرعة.

وتنطبق الأحداث Application فقط على التطبيقات WinForms عناصر (نشك أنها قد لا تنطبق في تطبيقات WPF نقية، ولكن). تسمية يمكن أن تكون مضللة لأنها تتم تسمية معظم الاستخدام العادي الأساسية الخاصة بهم والتي لديها بعض الافتراضات. ThreadExit لا تتصل System.Threading.Thread الفعلية ولكن بدلا من ذلك إلى حلقة رسالة (Application.Run())) لموضوع UI، وApplicationExit يتعلق على نحو مماثل لجمع أشكال التطبيق على واحد أو أكثر من المواضيع UI. عادة، وبمجرد أن الدعوة إلى Application.Run() العوائد، ودعا من طريقة الدخول للموضوع، وطريقة دخول بسرعة يخلص وموضوع نفسه ينتهي بعد ذلك. وبمجرد أن خرجت عن المواضيع UI، وهو التطبيق WinForms عناصر عادة ما يكون كل ذلك والمخارج.

وحدث آخر من المذكرة هو الحدث System.Windows.Forms.Application.ThreadException. يمكن تكوين حلقة رسالة يندوز تصفية الاستثناءات التي تحدث في التعامل مع رسالة وإرسال هذا الحدث بدلا من السماح لهم تكون الاستثناءات uncaught (وبالتالي قاتلة). اصطياد هذه الاستثناءات يسمح للحلقة رسالة (وهذا موضوع UI) لمتابعة تشغيل (بعد إجهاض معالج الرسالة الحالي). يمكن أن يكون هناك واحد فقط مشترك لهذا الحدث في أي وقت لموضوع معين (اشتراكات الكتابة لأي مشترك السابق)، ويجب أن يتم تكوين ذلك قبل إنشاء أي نموذج واشتركت قبل الدخول في حلقة رسالة. انظر التعليمات MSDN لهذا الحدث وSystem.Windows.Forms.Applicaton.SetUnhandledExceptionMode() لمزيد من المعلومات.

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