Неустранимая ошибка механизма выполнения в управляемом коде C # - PullRequest
0 голосов
/ 30 октября 2018

Я столкнулся с исключениями нарушения прав доступа и фатальной ошибкой механизма выполнения (похоже, это та же ошибка) в управляемом коде в C #. Я сузил его до следующего фрагмента. Я что-то пропустил? Я думал, что не должно быть возможности такого рода исключений в управляемом коде. Я видел это как в .net 4.7 и 4.5 и на нескольких разных компьютерах? Это известная проблема в .Net?

    public static class FatalExecutionEngineBugExposer
{

    public static void Main(string[] args)
    {

        for (int i = 0; i < 500000; i++)
        {
            try
            {
                var testProblem = new TestProblem();
                testProblem.AddTrianglesExperiment();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.GetBaseException());
            }
        }
    }

    public class TestProblem
    {
        public struct Point
        {
            public double X, Y, Z;
        }

        public void AddTrianglesExperiment()
        {
            var points = new Point[28800];

            Parallel.ForEach(Partitioner.Create(0, points.Length),
                range =>
                {
                    // Create cache
                    var cache = new CubeRefCache();
                    cache.Entries = new CubeRefCacheEntry[20000];

                    // Add triangles
                    for (int i = range.Item1; i < range.Item2; i++)
                    {
                        ProcessTriangle(ref points[i].X, ref points[i].Y, ref points[i].Z, cache);  
                    }
                });
        }

        void ProcessTriangle(ref double pt1, ref double pt2, ref double pt3, CubeRefCache cache)
        {
            cache.Add(0, 0);
        }

        public struct CubeRefCacheEntry
        {
            public int Index;
            public int Item;
        }

        class CubeRefCache
        {
            internal CubeRefCacheEntry[] Entries;

            internal void Add(int index, int item)
            {
                Entries[0].Index = index;
                Entries[0].Item = item;
            }
        }
    }
}

Этот фрагмент "обычно" не работает в течение минуты.

ОБНОВЛЕНИЕ: Вероятно, оно должно быть запущено в 64-разрядной версии. Если скомпилировано с «Any CPU», проблема воспроизводится намного дольше.

ОБНОВЛЕНИЕ 2: использования у меня:

usings

1 Ответ

0 голосов
/ 01 ноября 2018

Исходная проблема Github (https://github.com/dotnet/corefx/issues/33157) была закрыта как дубликат https://github.com/dotnet/coreclr/issues/20690. По-видимому, это известная проблема, исправленная в .NET 4.8.

...