Threading: Invoke nur mit SEH?

16/01/2010 - 14:41 von Armin Zingler | Report spam
Hallo,

von einem Worker-Thread aus wird Form.Invoke aufgerufen.
Dabei kann es vorkommen, dass die Form bereits geschlossen wurde.
Invoke führt dann zur Exception. Als (vermeintliche) Lösung habe
ich ein boolsches Flag im FormClosed-Ereignis auf True gesetzt.
Vom Worker-Thread aus prüfe ich das Flag (Pseudo-Code):

if not closed then
Form.invoke
end if

Dabei kann es wiederum vorkommen, dass das Flag zwischen
der Prüfung (if not closed) und dem Invoke-Aufruf gesetzt wurde.
Somit führt Invoke wieder zur Exception. Ich meine, man kann
den Fall zuverlàssig nur per Trial&Error lösen, d.h. den
Invoke-Aufruf in ein Try-Catch stecken. Sehe ich das richtig?

Ich meine, dass die Invoke-Methode selbst vor dem gleichen Problem steht:

If IsHandleCreated then
Invoke ausführen
else
Exception werfen
end if

Auch hierbei kann zwischen Prüfung (If IsHandleCreated) und tatsàchlichem Invoke
das Handle zerstört worden sein.

Welcher (Sperr-)Mechanismus bietet sich für dieses "Race" an?

Armin
 

Lesen sie die antworten

#1 Armin Zingler
16/01/2010 - 15:11 | Warnen spam
Armin Zingler schrieb:
Welcher (Sperr-)Mechanismus bietet sich für dieses "Race" an?



Anderes Beispiel:
Jeder Aufruf von o.Member mit o=Nothing löst ja eine NullReferenceException
aus. Die Runtime muss deswegen doch auch eine Prüfung vornehmen wie

if o is nothing then
throw NullReferenceException
else
Memberzugriff ausführen
end if

Auch hier kann zwischen der Prüfung und Ausführung o von einem
anderen Thread aus geàndert worden sein. Wobei das insofern
ein anderer Fall ist, da bei der Ausführung mit einer Kopie der
Objektreferenz gearbeitet wird. Das funktioniert auch dann noch,
wenn die Originalreferenz zwischenzeitlich mit Nothing überschrieben
wurde.

Auf mein Problem kann ich das jedoch nicht übertragen. Hierbei geht
es nicht um die Form-Referenz sondern um das Handle. Das liesse
sich zwar auch kopieren aber erstens kann ich darüber keinen Invoke-Aufruf
starten und zweitens gilt die Handle-Eigenschaft nicht als "sicher
für Multithreading".


Armin

Ähnliche fragen