Laden...

Ungültiger threadübergreifender Zugriff. Thread-Anfänger-Problem

Erstellt von Kasperdelasopa vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.690 Views
K
Kasperdelasopa Themenstarter:in
118 Beiträge seit 2006
vor 14 Jahren
Ungültiger threadübergreifender Zugriff. Thread-Anfänger-Problem

Hallo,

Ich bekomme beim Zugriff auf ein Ellipse Objekt aus einem Child Thread heraus folgende Fehlermeldung:

Ungültiger threadübergreifender Zugriff.

Ich will von dem Objekt eigentlich nur die Eigenschaften Objekt.Margin.Left und Objekt.Width auslesen.

Habe nach Lösungen gesucht. Ich finde aber wenn ich bei Google suche nur Lösungen wie ich den Eigenschaften Threadübergreifend Werte zuweisen kann, also über Dispatcher.BeginInvoke(...). Das geht auch. Aber das Auslesen des Eigenschaftswerts löst den Fehler aus.

Gruß

821 Beiträge seit 2009
vor 14 Jahren

Auch wenn du die SAchen über den Dispatcher ausließt ?

Poste mal deinen Code.

Gruß MA

K
Kasperdelasopa Themenstarter:in
118 Beiträge seit 2006
vor 14 Jahren

Genau hier ist mein Anfänger Problem.

Ich weis nicht wie ich das über den Dispatcher machen soll, das ich nen Rückgabewert erhalte.
Ich habe nur Beispiele gefunden wie eine anaonyme methode ohne Rückgabewert mit BeginInvoke ausgeführt werden kann.

Mit Rückgabewert habe ich nix gefunden.

Hier könnte ich einen kleinen Schupser in die richtige Richtung gebrauchen.

821 Beiträge seit 2009
vor 14 Jahren

hmm wenn ich dich jetzt nicht falsch verstanden habe:


            string theReturnment;

            this.Dispatcher.Invoke(new Action(delegate()
            {
                theReturnment = MethodToDispatch(...);
            }));

somit kannst du ganz einfach Variablen die in deinem eigentlichen Thread laufen Werte zuweisen, die aus dem Dispatcher-Thread kommen

K
Kasperdelasopa Themenstarter:in
118 Beiträge seit 2006
vor 14 Jahren

Ich habe folgenden Eigenschaftswert in meinen Hauptthread definiert


public Ellipse PAWN
{
set
{
if (!pawn.Dispatcher.CheckAccess())
{

pawn.Dispatcher.BeginInvoke(new Action(delegate()
{
pawn = value;
}));
}
else
pawn = value;
}
get
{
if (!pawn.Dispatcher.CheckAccess())
{
Ellipse theReturnment = null;

pawn.Dispatcher.BeginInvoke(new Action(delegate()
{
theReturnment = this.pawn;
}));

return theReturnment;
}
else
return pawn;
}
}

Das Rückgabeobjekt theReturnment wird aber nicht zugewiesen, es bleibt null und es wird auch nur null zurückgegeben

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo Kasperdelasopa,


pawn.Dispatcher.BeginInvoke(new Action(delegate()
{
theReturnment = this.pawn;
}));

return theReturnment;


Hier liegt der Fehler.
Du verwendest BeginInvoke (also asynchron)
Dann gibst du theReturnment zurück und das geschieht schon bevor das BeginInvoke ausgführt wurde.
Also der Wert wird zwar gesetzt aber zu spät

Verwende mal stattdessen Dispatcher.Invoke damit wird das synchron ausgeführt und das Problem sollte sich lösen

Gruss
Michael

K
Kasperdelasopa Themenstarter:in
118 Beiträge seit 2006
vor 14 Jahren

Hallo

die Mehtode Dispatcher.Invoke existiert anscheinend in Silverlight nicht. Hast du noch ne andere Idee?

Gruß

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo Kasperdelasopa,

die Mehtode Dispatcher.Invoke existiert anscheinend in Silverlight nicht. Hast du noch ne andere Idee?

Oh habe nicht gesehen dass es sich um Silverlight handelt

Da kann man keine synchronen Operationen machen, deshalb muss man ein wenig improvisieren.
Du könntest entweder einfach ein Event schmeissen (im Begin-Invoke Code) sobald du den Wert gesetzt hast. Oder du rufst da einfach eine Methode auf die dann irgendwas updated usw.

Gruss
Michael

821 Beiträge seit 2009
vor 14 Jahren

....oder warte Alternativ mit Dispatcher.EndInvoke() auf das Ende der Ausführung!

Jedoch ist die Ausführung von michlG zu bevorzugen !