38 votes

Code démontrant l'importance d'une région d'exécution contrainte

Quelqu'un pourrait-il créer un court échantillon qui se casse, à moins que le [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] soit appliqué?

Je viens de parcourir cet exemple sur MSDN et je n'arrive pas à le casser, même si je commente l'attribut ReliabilityContract. Semble enfin toujours être appelé.

48voto

jyoung Points 2598
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();
        }
    }
}

Lorsque MyFn est jitted, il tente de créer une ConstrainedRegion du bloc finally.

  • Dans le cas sans ReliabilityContract, pas de ConstrainedRegion pourraient être formés, de manière régulière code est émis. Le débordement de la pile d'exception est levée lors de l'appel à Stackoverflow (après le bloc try est exécuté).

  • Dans le cas de la ReliabilityContract, un ConstrainedRegion pourraient être formés et la pile exigences de méthodes dans le bloc finally pu être soulevées dans MyFn. L'exception de dépassement de pile est maintenant jeté sur l'appel à MyFn (avant le bloc try est jamais exécutée).

21voto

Peter Oehlert Points 6351

Le conducteur principal de cette fonctionnalité a été à l'appui de Serveurs SQL exigences strictes pour l'intégration de la CLR dans SQL Server 2005. Probablement afin que d'autres puissent l'utiliser et probablement pour des raisons juridiques, cette intégration en profondeur a été publié comme une API d'hébergement, mais les exigences techniques ont été les Serveurs SQL. Rappelez-vous que dans SQL Server, MTBF est mesurée en mois, pas en heures et le processus de redémarrage en raison d'une exception non gérée s'est passé est totalement inacceptable.

Cet article MSDN Magazine est probablement le meilleur que j'ai vu de la description des spécifications techniques de la contrainte de l'environnement d'exécution a été construit pour les.

Le ReliabilityContract est utilisé pour décorer vos méthodes pour indiquer la façon dont ils fonctionnent dans des conditions potentiellement asynchrone exceptions (ThreadAbortException, OutOfMemoryException, StackOverflowException). Une exécution limitées région est définie comme une prise ou enfin (ou à défaut) de la section d'un bloc try qui est immédiatement précédé par un appel Système.Moment de l'exécution.CompilerServices.RuntimeServices.PrepareConstrainedRegions().

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

Lorsqu'un ReliabilityContract méthode est utilisée à partir d'un CER, il y a 2 choses qui peuvent se produire à elle. La méthode sera pré-préparé par l'équipe afin de ne pas invoquer le compilateur JIT la première fois qu'il est exécuté, ce qui pourrait essayer d'utiliser la mémoire elle-même et cause ses propres exceptions. Aussi tandis qu'à l'intérieur d'un CER l'exécution des promesses de ne pas jeter un ThreadAbort exception et à attendre pour lancer l'exception jusqu'à ce que après le CER a terminé.

Donc, pour revenir à votre question, je suis encore à essayer de venir avec un simple exemple de code qui permettra de répondre directement à votre question. Comme vous l'avez déjà deviné cependant, l'échantillon le plus simple est d'aller demander beaucoup de code donné la nature asynchrone du problème et sera probablement SQLCLR code parce que c'est l'environnement qui va utiliser CERs pour le plus grand bénéfice.

3voto

jrista Points 20950

Exécutez-vous l'exemple MSDN sous le débogueur? Je ne pense pas qu'il soit possible pour CER de fonctionner lorsque vous exécutez dans le débogueur, car le débogueur lui-même change de toute façon la nature de l'exécution.

Si vous générez et exécutez l'application en mode de publication optimisé, vous devriez pouvoir la voir échouer.

1voto

Relster Points 403

Alors que je n'ai pas d'exemple concret pour vous, je pense que vous êtes absent le point d'avoir un try..finally bloc à l'intérieur des méthodes qui garantissent le succès. Le point entier de dire que la méthode est toujours une réussite signifie que ce qui concerne ce que (à l'exception se produit lors de l'exécution, des mesures seront prises pour assurer l'accès aux données sera dans un état valide quand le retour de la méthode. Sans l'essayer..enfin, vous ne seriez pas garantir quoi que ce soit, et pourrait signifier que seule la moitié des opérations que vous voulais arriver, va arriver. Ainsi, La Cer.Le succès ne fait pas une garantie de succès, il indique seulement que vous en tant que le développeur sont la garantie du succès.

Consultez cette page pour une explication de la différence entre le Succès et l'MayFail états qu'il appartient à un Tableau.Méthode CopyTo: http://weblogs.asp.net/justin_rogers/archive/2004/10/05/238275.aspx

-5voto

ima Points 4782

Les attributs CER sont des moyens de documentation. Ils influencent la façon dont CLR exécutera le code dans certaines situations, mais je pense qu’ils (ou leur absence) n’entraîneront jamais d’erreur dans les versions actuelles de .NET.

Ils sont pour la plupart «réservés pour une utilisation future».

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X