c# - 演示受限执行区域重要性的代码

标签 c# .net concurrency cer

除非应用[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)],否则任何人都可以创建一个会中断的简短示例吗?

我刚刚浏览了这个 sample on MSDN并且无法让它中断,即使我注释掉了 ReliabilityContract 属性。最后似乎总是被调用。

最佳答案

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 被 jitted 时,它会尝试从 finally block 创建一个 ConstrainedRegion

  • 在没有ReliabilityContract的情况下,无法形成适当的ConstrainedRegion,因此会发出常规代码。堆栈溢出异常在调用 Stackoverflow 时抛出(在执行 try block 之后)。

  • ReliabilityContract 的情况下,可以形成一个 ConstrainedRegion 并且 finally block 中方法的堆栈要求可以被提升到 MyFn。调用 MyFn 时会抛出堆栈溢出异常(在执行 try block 之前)。

关于c# - 演示受限执行区域重要性的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1101147/

相关文章:

asp.net - 内部 Azure WCF 服务是否需要安全性

opengl - GLSL、信号量?

swift - Swift 中的并发和锁

c# - 如何使用 paypal 直接付款 NPV API c# 设置自定义定期付款服务

c# - 我可以使用 Azure 存储队列中的 Response<SendReceipt> 验证消息是否已成功发送

c# - 抛出异常,除非在断点后运行

c# - 跨 AppDomain 的损坏状态异常 (CSE)

java - 使用两个线程写入/读取 Vector(或 ArrayList)

c# - Singleton vs PrEcision vs PerCall 状态管理

javascript - 如何在其操作回调中禁用自定义 DataTables 按钮?