الحالات التي لا يتم فيها التنفيذ أخيرًا في محاولة .net.. أخيرًا يتم الحظر

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

  •  02-07-2019
  •  | 
  •  

سؤال

لقد سمعت بشكل أساسي أن شروطًا معينة ستتسبب في تجاوز .net للكتلة النهائية.فهل يعرف أحد ما هي تلك الشروط؟

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

المحلول

احتمالان:

لن يتم تنفيذ الكتلة الأخيرة عندما يكون هناك StackOverflowException نظرًا لعدم وجود مساحة على المكدس حتى لتنفيذ أي تعليمات برمجية أخرى.ولن يتم استدعاؤه أيضًا عندما يكون هناك ExecutionEngineException, ، والتي قد تنشأ من استدعاء ل Environment.FailFast().

نصائح أخرى

ما لم ينفجر CLR وينخفض ​​باستخدام ExecutingEngineException (لقد رأيت عددًا قليلاً منها في .net 1.1 يومًا مع المقدار المناسب من COM Interop :) ..أعتقد أنه ينبغي في النهاية دائماً ينفذ.

يمكنك الحصول على موقف حيث يتسبب الكود الموجود في كتلة المحاولة في طرح SecurityException قبل إدخال كتلة المحاولة (بدلاً من ذلك يتم طرح الاستثناء عند استدعاء الطريقة المحتوية (راجع http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx)))، في هذه الحالة، لن تدخل مطلقًا إلى كتلة المحاولة، لذا لا يتم استدعاء الكود الموجود في الكتلة الأخيرة مطلقًا.

تشمل الاحتمالات الأخرى StackOverflowException وExecutingEngineException.

Finally منع على background thread قد لا ينفذ.ومع ذلك، فإنه يعتمد على التنفيذ الكامل main foreground thread الذي ينتهي background thread العملية حتى قبل التنفيذ الكامل لل background thread.

class Program
{

    static void Main(string[] args)
    {
        Program prgm = new Program();
        Thread backgroundThread = new Thread(prgm.CheckBgThread);
        backgroundThread.IsBackground = true;
        backgroundThread.Start();
        Console.WriteLine("Closing the program....");
    }

    void CheckBgThread()
    {
        try
        {
            Console.WriteLine("Doing some work...");
            Thread.Sleep(500);
        }
        finally
        {
            Console.WriteLine("This should be always executed");
        }
    }
}

هناك أيضًا طريقة Application.Exit.

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

لاحظ أنه من المناسب الاعتماد على الكتل النهائية، على عكس أساليب "Finalize" (أو "destructors" في C#) التي لا ينبغي الاعتماد عليها بشكل صحيح.

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