.net 当以前的使用量超过其声明的分配量时,GC.TryStartNoGCRegion将引发

hwamh0ep  于 2023-02-20  发布在  .NET
关注(0)|答案(2)|浏览(130)

如果之前的使用超出了它声明的分配,我找不到调用GC.TryStartNoGCRegion的方法。在这种情况下,GC.EndNoGCRegion会根据文档抛出,并且对TryStartNoGCRegion的新调用也会抛出:

GC.TryStartNoGCRegion(1000*10000);

        //Allocate more than declared
        for (int i = 0; i < 1100; i++)
        {
            var arr = new byte[10000];
        }

        //Line below throws as it should
        //System.GC.EndNoGCRegion();

        //Not NoGCRegion
        Console.WriteLine(System.Runtime.GCSettings.LatencyMode);

        //Throws with "The NoGCRegion mode was already in progress
        GC.TryStartNoGCRegion(1000*10000);

如何再次启动无GC模式?

snvhrwxg

snvhrwxg1#

试试这个:

static void Main(string[] args)
{
    GC.TryStartNoGCRegion(1000 * 10000);

    //Allocate more than declared
    for (int i = 0; i < 1100; i++)
    {
        var arr = new byte[10000];
    }

    //Line below throws as it should
    try
    {
        System.GC.EndNoGCRegion();
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }

    //Not NoGCRegion
    Console.WriteLine(System.Runtime.GCSettings.LatencyMode);

    //Throws with "The NoGCRegion mode was already in progress
    Console.WriteLine(GC.TryStartNoGCRegion(1000 * 10000));

    Console.ReadLine();
}

明显的区别在于,在尝试再次调用TryStartNoGCRegion之前,必须先调用EndNoGCRegion(并吞下异常)。

pxy2qtax

pxy2qtax2#

我知道这是一个老问题,无论如何,我只是想留下一个说明,这是一个错误,它已经在this PR与this提交修复。修复是可用的.NET核心3.1或以上。

相关问题