Il nostro software esegue il rendering di disegni tecnici. Un disegno particolare ha causato l'arresto anomalo dell'applicazione ogni volta con un valore OutOfMemoryException. All'indagine, nulla sembrava fuori dall'ordinario; l'app non ha richiesto molta memoria, non ha utilizzato molte maniglie. Ho provato a rilevare l'eccezione e l'app ha terminato il disegno senza lanciarne un altro. In effetti, c'era sempre solo l'OutOfMemoryException, ed era sempre la stessa primitiva grafica a causarlo.Arresto riproducibile tramite Graphics.DrawArc
Il seguente codice è il minimo richiesto per causare questo particolare arresto anomalo. Sembra che l'esatta combinazione di dimensioni dell'immagine, stile penna e coordinate causi l'eccezione. Arrotondare le coordinate fino a tre decimali fa scomparire, così come ridurre le dimensioni della grafica o utilizzare una penna senza tratteggio.
using (Bitmap b = new Bitmap(200, 200))
{
using (Graphics g = Graphics.FromImage(b))
{
using (Pen p = new Pen(Color.Black))
{
p.DashPattern = new float[]{10.0f, 2.0f};
RectangleF r = new RectangleF(
BitConverter.ToSingle(new byte[]{0xD3, 0x56, 0xB3, 0x42}, 0),
BitConverter.ToSingle(new byte[]{0x87, 0x2D, 0x17, 0x43}, 0),
BitConverter.ToSingle(new byte[]{0xE2, 0x81, 0xD1, 0x3F}, 0),
BitConverter.ToSingle(new byte[]{0xE2, 0x81, 0xD1, 0x3F}, 0));
float st = BitConverter.ToSingle(new byte[]{0x6B, 0xF6, 0x1A, 0x42}, 0);
float sw = BitConverter.ToSingle(new byte[]{0x6D, 0x33, 0x4F, 0x40}, 0);
g.DrawArc(p, r, st, sw);
}
}
}
In questo caso non è complicato per creare una soluzione, ma mi chiedevo se qualcuno avesse una spiegazione per questo.
Molto informativo, grazie. Non mi è venuto in mente che la segnalazione degli errori GDI potrebbe essere così limitata. – waldrumpus