2016-07-28 12 views
2

Ich arbeite an einem Projekt, bei dem die Steuerung aktualisiert und ein neues Bild alle 10 Sekunden in einem Fenster gezeichnet wird. Der folgende Code löscht diesen Bereich zuerst. Dann wird eine Grenze gezogen.So verhindern Sie ExternalException, die auf Grafikobjekt auftritt

private void DrawRectangle(Color color) 
{ 
    using (var graphics = CreateGraphics()) 
    using (var pen = new Pen(color)) 
    { 
     graphics.Clear(Color.Black); //External exception is thrown here. 
     graphics.DrawRectangle(pen, 0, 0, Size.Width - 1, Size.Height - 1); 
    } 
} 

Normalerweise alles funktioniert gut, aber wenn ich sperren Fenster (drücken Sie Win + L) dann nach 10 Sekunden, wenn graphics.Clear(Color.Black) Anweisung ausgeführt wird, Anwendung abstürzt.

Gemäß MSDN page: Die Clear-Methode löscht den Status des Grafikobjekts und sollte nicht aufgerufen werden, wenn das Grafikobjekt nicht aktualisiert werden kann. Wenn beispielsweise die Clear-Methode auf einem sicheren Desktop in einer Terminalserversitzung aufgerufen wird, kann eine ExternalException auftreten, wodurch das Graphics-Objekt inkonsistent bleibt.

Was soll ich tun, um diesen Absturz zu verhindern? Soll ich überprüfen, ob Windows gesperrt ist oder nicht? und wird das der einzige Fall sein, in dem dieser Unfall auftreten wird?

Update: Das gleiche Problem tritt auf, wenn der Bildschirmschoner aktiviert ist.

+0

Können Sie überprüfen, ob dies auch passiert, wenn Sie Ihre Anwendung minimieren oder ein anderes Fenster über Ihre Anwendung hängen? Wenn der Bildschirm nicht den Bildschirm auf der Vorderseite zeigt, wird das Grafikobjekt zerstört, denke ich. Aktualisieren Sie Ihre Frage mit dem Lebenszyklus von Grafiken. – Glubus

+0

Nein. Dies geschieht nicht, wenn die Anwendung minimiert wird. Nach Ablauf des Timers wird jedoch ein weiteres Panel angezeigt, und dieser Absturz erfolgt auf dem neuen Panel. Vielleicht ist das nützlich .. –

+0

Sie sprechen über einen Timer, und das alle 10 Sekunden, die Sie etwas tun. Können Sie uns diesen Code zur Verfügung stellen? Es scheint, als ob das Problem dort liegt. – Glubus

Antwort

1

Wenn Sie CreateGraphics() aufrufen, wenn Windows gesperrt ist oder der Bildschirmschoner angezeigt wird, befindet sich das zurückgegebene Grafikobjekt im Status "Inkonsistent" und kann nicht zum Zeichnen verwendet werden. Wenn wir ein solches Grafikobjekt verwenden, wird ExternalException ausgelöst.

Der beste Weg, um dieses Problem loszuwerden, wird von Benutzer Hans Passant vorgeschlagen. Verwenden Sie anstelle der CreateGraphics() - Methode zum Erstellen eines Grafikobjekts das Paint-Ereignis des Bereichs. Paint-Ereignishandler enthält Ereignisargumente, die Grafikobjekte enthalten. Dieses Grafikobjekt sollte zum Malen verwendet werden.

Der Grund dafür ist, dass das Paint-Ereignis des Panels nicht aufgerufen wird, wenn Windows gesperrt ist oder der Bildschirmschoner angezeigt wird. Es wird also kein inkonsistentes Grafikobjekt zum Malen verwendet.

Verwandte Themen