Неустранимая ошибка механизма выполнения в управляемом коде C#
Я столкнулся с Access Violation Exceptions и Fatal Execution Engine Error (похоже, это та же ошибка) в управляемом коде в 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-разрядном. Если скомпилировано с "Любой процессор", проблема занимает гораздо больше времени для воспроизведения.
ОБНОВЛЕНИЕ 2: использования у меня есть:
1 ответ
Оригинальная проблема Github ( https://github.com/dotnet/corefx/issues/33157) была закрыта как дубликат https://github.com/dotnet/coreclr/issues/20690. По-видимому, это известная проблема, которая была исправлена в.NET 4.8
,