Как обойти .NET Недостаточно памяти при ошибке GDI + DrawArc () и найти справочный материал - PullRequest
2 голосов
/ 25 октября 2019

Я знаю, что GDI + немного устарел, но в настоящее время я вынужден использовать его в приложении WinForms для рисования сложных моделей типов CAD.

Я столкнулся с той же проблемой, что и: Почему моему методу рисования c # не хватает памяти? , как описано в принятом в настоящее время ответе (https://stackoverflow.com/a/7501899/9300908), а также в некоторых комментариях. Я обеспечил удаление моих кистей, ручек и шрифтова также растровые изображения и другие объекты gdi. Я рисую от 10 до 100 тысяч дуг с помощью функции DrawArc(), и одна и та же дуга (1,13 градуса) каждый раз доставляет мне неприятности. Я подозреваю, что столкнулся с маленькой дугойошибка.

Я планирую просто нарисовать линию вместо дуги, когда условия превышают определенный порог, но я пытаюсь определить порог. Я пытаюсь найти хороший источник длякакой размер слишком мал (я вижу ссылки на <1 градус, <2 пикселя, <3,5 градуса), так что мне не нужно полагаться на обработчик исключений, особенно когда имеешь дело с подобнымиy маленькие дуги. </p>

Ссылочный ответ, а также комментарии относятся к ряду статей Microsoft Connect, которые недоступны в настоящее время после выхода Microsoft Connect на пенсию. Кажется, у меня нет волшебного соуса, чтобы найти его в сообществе разработчиков визуальных студий, где я думал, что его можно перенести. У кого-нибудь есть какие-либо справочные материалы по ошибке в DrawArc или, возможно, альтернативный обходной путь?

Соедините ссылки:

Упоминается в msdn относительно DrawPath:

Другие форумы, которые я нашел, указывают нассылка вопрос .

Обновление

Среда - x64, .NET 4.5.2

1.13 - SweepAngle (действующие значения см. ниже). Это и startAngle оба являются родными числами с плавающей точкой.

Я могу воссоздать исключение с этим примером кода из нового приложения WinForms.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // g is a graphics object created from a 1920W x 1080H Bitmap:
        using (Bitmap mBitmapModel = new Bitmap(1920, 1080))
        {
            using (Graphics g = Graphics.FromImage(mBitmapModel))
            {
                float lStartAngle = -0.00816029962F;
                float lSweepAngle = 1.13203466F;
                RectangleF lRect = new RectangleF(742.741333F, 157.927505F, 3.28945208F, 3.28945208F);

                using (Pen lPen = new Pen(Color.Blue, 2F))
                {
                    g.DrawArc(lPen, lRect, lStartAngle, lSweepAngle);
                }
            }
        }
    }
}
...