WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 01.12.2004, 16:48   #1
cndg
bitte Mailadresse prüfen!
 
Registriert seit: 26.12.2002
Alter: 41
Beiträge: 140


Frage .net: EndInvoke verlassen?

Hi!

Habe folgendes Problem, zu dem ich einfach keinen Ausweg finde: Ich führe an einer bestimmten Stelle im Programm einen EndInvoke-Call aus (um auf einen Rückgabewert zu warten) und bin mir darüber im Klaren, mit diesem Aufruf einen Deadlock verursachen zu können. Gibt es ein asynchrones EndInvoke/Invoke-Äquivalent, das sich non-blocking verhält und mir damit erlaubt, den Deadlock zu umgehen, das ich in einer Schleife so lange aufrufen kann, bis es einen Rückgabewert liefert?

mfg
cndg
cndg ist offline   Mit Zitat antworten
Alt 01.12.2004, 18:19   #2
Biri
Hero
 
Registriert seit: 04.09.2001
Beiträge: 894


Standard

hi !

sorry, kann dir da jetzt leider kein codebeispiel geben, aber soweit ich das jetzt weiß, ist der sinn von endinvoke ja, auf das ergebnis eines async. calls zu warten - also u.U. recht lange.

alle async methoden haben aber eine BeginAsync... methode, der kann man dann einen delegate übergeben (funktionszeiger), der automatisch aufgerufen wird, wenn die asynchrone methode beendet wurde - das ist ja auch sinn der sache: inzwischen was anderes machen, aber eine meldung bekommen, wenn die async. funktion fertig ist.

was genau willst du machen, wo du ein endinvoke benötigst ?

fg
-hannes
Biri ist offline   Mit Zitat antworten
Alt 01.12.2004, 18:51   #3
cndg
bitte Mailadresse prüfen!
 
Registriert seit: 26.12.2002
Alter: 41
Beiträge: 140


Standard

Hallo!

Ich werd mal ganz dezent versuchen, dir die genauen Umstände zu erläutern: Da gibt es einerseits den Main Thread, wo unter anderem die ganzen Steuerelemente erzeugt und betreut werden und dann hab ich da einen Background Thread, der unbedingt Zugriff auf die Steuerelemente des Main Threads benötigt, da er Änderungen unverzüglich an die Steuerelemente weitergeben muss.
Die Steuerelemente werden vom Background Thread aus via Invoke-Statements angesprochen. So weit so gut, ABER: Manche Invokes befinden sich innerhalb eines SyncLock-Blocks, da die Code-Teile, in denen sich diese Invokes befinden unbedingt in einem ausgeführt werden müssen, um Race Conditions in Verbindung mit dem Main Thread zu vermeiden.

Wenn nun der Main Thread in einer Event Handling Method auf ein vom Background Thread zufällig bereits in Anspruch genommenes SyncLock-Monitorobjekt stößt, wartet er, bis der Background Thread dieses Monitorobjekt wieder loslässt, was ihm aber in all jenen Fällen, in denen der Background Thread gerade mit einem Invoke innerhalb eines SyncLock-Blocks darauf wartet, dass der Main Thread die Event Handling Method endlich verlässt, verständlicherweise nie gelingen wird. Das führt dann eben unweigerlich zu einem Deadlock und die Mühle steht.

Das führte mich zu folgender Überlegung: Wenn doch das Invoke so tolerant gegenüber dem Main Thread wäre und nicht stur darauf beharren würde, unbedingt blockieren zu müssen, bis der Main Thread fertig ist. Und an diesem Punkt muss ich gestehen: Jetzt ist mir klar geworden, dass es eigentlich gar nix bringt, wenn das Invoke nachgibt, weil sich das Invoke noch immer innerhalb des SyncLock-Blocks befindet. Also eigentlich ist die Lage sogar irgendwie aussichtlos.

Bin irgendwie noch ratloser als zuvor.

mfg
cndg
cndg ist offline   Mit Zitat antworten
Alt 02.12.2004, 23:43   #4
JackLemon
Senior Member
 
Registriert seit: 02.11.2002
Beiträge: 179


Standard

wieso denn nicht einfach noch ein thread, dem du ganz einfach zb. ein delegate übergibst?
____________________________________
It\'s not a bug... It\'s a feature!

You know, the main advantage of encrypted paella over ordinary paella is that nobody but you knows what you are eating... (Alvaro)
JackLemon ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:58 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag