الرمز الذي يدل على أهمية منطقة التنفيذ المقيدة

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

  •  12-09-2019
  •  | 
  •  

سؤال

يمكن لأي شخص أن يخلق عينة قصيرة هذا يكسر، ما لم [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] يتم تطبيقه؟

ركضت فقط من خلال هذا عينة على MSDN. وأنا غير قادر على كسره لكسر، حتى لو كنت أعلق سمة الموثوقية. وأخيرا يبدو أن تسمى دائما.

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

المحلول

using System;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;

class Program {
    static bool cerWorked;

    static void Main( string[] args ) {
        try {
            cerWorked = true;
            MyFn();
        }
        catch( OutOfMemoryException ) {
            Console.WriteLine( cerWorked );
        }
        Console.ReadLine();
    }

    unsafe struct Big {
        public fixed byte Bytes[int.MaxValue];
    }

    //results depends on the existance of this attribute
    [ReliabilityContract( Consistency.WillNotCorruptState, Cer.Success )] 
    unsafe static void StackOverflow() {
        Big big;
        big.Bytes[ int.MaxValue - 1 ] = 1;
    }

    static void MyFn() {
        RuntimeHelpers.PrepareConstrainedRegions();
        try {
            cerWorked = false;
        }
        finally {
            StackOverflow();
        }
    }
}

عندما تعتبر MyFN، فإنها تحاول إنشاء تقييد من كتلة أخيرا.

  • في الحالة دون موثوقية، لا يمكن تشكيل أي تقييد مناسب، لذلك يتم انبعاث رمز منتظم. يتم إلقاء استثناء تجاوز سعة المكدس على المكالمة إلى Stackoverflow (بعد تنفيذ كتلة TRY).

  • في الحالة مع موثوقية، يمكن تشكيل القيد وإقليم متطلبات الأساليب في الكتلة في النهاية يمكن رفعها إلى MYFN. يتم الآن إلقاء استثناء تجاوز المكدس على المكالمة إلى MYFN (قبل تنفيذ كتلة المحاولة).

نصائح أخرى

كان برنامج التشغيل الأساسي لهذه الوظيفة دعم المتطلبات الصارمة لخوادم SQL لإدماج CLR في SQL Server 2005. ربما بحيث يمكن للآخرين استخدام الأسباب القانونية التي تم نشرها، تم نشر هذا التكامل العميق كبرنامج واجهة برمجة تطبيقات استضافة ولكن المتطلبات الفنية كانت خوادم SQL. تذكر أنه في SQL Server، يتم قياس MTBF في أشهر لا ساعات وأعاد تشغيل العملية لأن استثناء غير معالج قد حدث تماما غير مقبول تماما.

هذه مجلة MSDN المادة ربما يكون أفضل ما رأيته في وصف المتطلبات الفنية تم بناء بيئة التنفيذ المقيدة ل.

يستخدم الموثوقية في تزيين أساليبك للإشارة إلى كيفية عملها من حيث الاستثناءات غير المتزامنة المحتملة (threadabortException، outofmemoryexception، stackoverflowException). يتم تعريف منطقة التنفيذ المقيدة على أنها مقطع مصيد أو أخيرا (أو خطأ) من كتلة المحاولة التي تسبقها على الفور مكالمة إلى system.runtime.compilerservices.runtimeservices.prepareConstrain ().

System.Runtime.CompilerServices.RuntimeServices.PrepareConstrainedRegions();
try 
{
    // this is not constrained
} 
catch (Exception e) 
{
    // this IS a CER
} 
finally 
{
    // this IS ALSO a CER
}

عند استخدام طريقة الموثوقية من داخل CER، هناك 2 أشياء تحدث لها. سيتم تحضير الطريقة مسبقا من قبل JIT بحيث لن تستدعي محمولة JIT المرة الأولى التي يتم تنفيذها والتي قد تحاول استخدام الذاكرة نفسها وتسبب استثناءاتها الخاصة. أيضا بينما يعد داخل Cer في وقت التشغيل بعدم رمي استثناء Threadabort وسنتوقع لرمي الاستثناء حتى بعد اكتمال CER.

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

هل تقوم بتشغيل عينة MSDN تحت مصحح الأخطاء؟ لا أعتقد أنه من الممكن لوظيفة CER عند التنفيذ داخل المصحح، حيث يغير مصحح الأخطاء نفسها طبيعة التنفيذ على أي حال.

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

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

تحقق من هذه الصفحة للحصول على شرح للفروق بين النجاح وولايات mayfail لأنه يتعلق بطريقة صفيف. http://weblogs.asp.net/justin_rogers/archive/2004/10/05/238275.aspx.

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

معظمهم "محجوزون للاستخدام في المستقبل".

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