2015-05-04 4 views
6

Sto lavorando a un'applicazione in cui il client presenta un problema ogni due mesi (è in grado di risolvere il problema riavviando l'applicazione). La traccia dello stack fa sempre riferimento alla prima riga di un override (classe eredita dal metodo Control) OnPaint() che effettua una chiamata a e.Graphics.Clear().Graphics.Clear() all'interno di OnPaint() causa occasionalmente errore GDI + generico

ho letto su Microsofts documentazione che:

Il metodo Clear cancella lo stato della grafica oggetto e non deve essere chiamato quando la grafica oggetto non può essere aggiornato. Ad esempio, se il metodo Clear viene richiamato su un desktop protetto in una sessione di terminal server, può verificarsi un'eccezioneExternalException, lasciando l'oggetto Graphics in uno stato incoerente.

Ho verificato che gli utenti dell'applicazione non eseguono l'applicazione da un computer remoto. Ho anche letto che:

Quando sovrascriviamo OnPaint in una classe derivata, assicurarsi di chiamare il metodo OnPaint della classe base, in modo che i delegati registrati ricevano l'evento.

Potrebbe il fatto che l'applicazione attualmente non chiama la classe base OnPaint() causare 'si è verificato errore generico in GDI +' un messaggio di errore ExternalException?

Sfortunatamente sto prendendo una pugnalata al buio a questo problema perché non riesco a riprodurlo e succede molto raramente negli scenari di produzione. Qualcuno potrebbe fornire qualche intuizione?

+4

Molti degli oggetti System.Drawing sono monouso. Non eliminarli è un * molto * svista comune. Funziona a lungo, di solito il GC funziona abbastanza spesso per evitare problemi. Fino a quando non lo fa, si ottengono eccezioni weirdo come questo. Utilizzare la scheda Task Manager, Processi. Visualizza + Seleziona colonne e seleziona Oggetti GDI. Correggi il tuo codice in modo che il numero rimanga al di sotto di un paio di centinaia di volte. –

+0

Si potrebbe provare a prendere l'errore –

+0

Dovrei chiamare 'dispose()' invece di 'clear()' all'interno del metodo 'OnPaint()'? – rage

risposta

0

Se si creare la grafica, utilizzare sempre in Using statement:

Using gr As Graphics = Graphics.FromImage(image) 

    textSize = gr.MeasureString(myString, myFont) 'sample usage 

End Using 

D'altra parte, maiDispose() l'oggetto si non hanno creato. (Comprese le istanze di Graphics ...) Quando lo semplifichiamo, in tal caso è in attesa del suo 'End Using' da qualche altra parte, vicino al luogo in cui ha ottenuto il suo 'Using'.