Laden...

[erledigt] Silverlight 4 + Webservice (Asynchron)

Erstellt von CyberHunter vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.073 Views
C
CyberHunter Themenstarter:in
131 Beiträge seit 2007
vor 13 Jahren
[erledigt] Silverlight 4 + Webservice (Asynchron)

Hallo zusammen,

Ich verwende in meiner Silverlight Anwendung diverse Methoden von einem ASP.NET Webservice.
Dazu stellt sich mir die Frage warum werden die Methoden standartmäßig in Silverlight überhaupt Asynchron aufgerufen?

Nun zu meinem konkreten Prolem:
Meine Webservice Methode "getID" gibt mir einen Int32 Wert zurück, diesen rufe ich so auf:



Int32 idvalue = 0;
bool inArbeit = true;

 _webservice.getIDCompleted += (object s, WebService.getIDEventArgs ea) =>
                {
                    idvalue = ea.Result;
                    inArbeit = false;
                   lblTest.Content = idvalue.ToString();
                };
            _webservice.getIDAsync("Bezeichnung");

while(inArbeit)
{
System.Diagnostics.Debug.WriteLine("warten....");
}

Messagebox.Show(idvalue.ToString());


Diesen Aufruf habe ich in enem Button_Click, wenn ich den Button klicke steht die ID sofort in meinem Test-Label (lblTest) (wenn ich die schleife + Messagebox danach nicht ausführe). Das dauert keine halbe sekunde.
Mit der Variabel "inArbeit" habe ich versucht mein problem zu lösen in dem ich warte bis die Methode fertig ist. Jedoch wird die Schleife nie beendet. Warum?
Wenn ich die Schleife weg lasse gibt mir die Messagebox immer 0 aus.
Wenn ich einen Breakpoint auf die folgende Zeile setze:


      inArbeit = false;

Wird dieser sofort nach dem Klick auf den Button erreicht.
Jedoch wir der Code mit der Messagebox immer vorher ausgeführt.
Mir kommt es so vor das die Methode "getID" erst durchgeführt wird wenn aller Code in meinem Button_Click Event ausgeführt wurde.
Habe auch schon versucht mit Thread.Sleep() vor der Messagebox zu warten, funzt aber auch nicht.
Wie schaffe ich es das mein Code wartet bis der Asynchrone aufruf fertig ist?
Oder kann ich die Methode Synchron wie aus einer Winform Anwendung aufrufen?

Danke für eure Hilfe
CyberHunter

297 Beiträge seit 2008
vor 13 Jahren

Ich nehme stark an, dass es daran liegt, dass der Callback in einem separaten Thread ausgeführt wird und deshalb irgendwas schief geht.
Was willst du denn überhaupt erreichen bzw. was genau ist dein Problem? Warum willst du diese Schleife haben?

There are 10 kind of people, those who understand binary and those who don't.

C
CyberHunter Themenstarter:in
131 Beiträge seit 2007
vor 13 Jahren

Hallo Schlopp,

danke für deine Antwort.
Ja das ist eben das Problem das dieser Aufruf Asynchron von statten geht.
Die Schleife war nur ein Test der nicht funktioniert hat.
Mein Problem ist das die Messagebox immer 0 ausgibt weil wie es aussieht
die Methode "_webservice.getIDAsync("Bezeichnung")" erst ausgeführt wird wenn der Code im Button_Click Event fertig durchgelaufen ist.

Natürlich könnte ich die Messagebox hier schon ausführen:


_webservice.getIDCompleted += (object s, WebService.getIDEventArgs ea) =>
                {
                    idvalue = ea.Result;
                    Messagebox.Show(idvalue.ToString());
                };
            _webservice.getIDAsync("Bezeichnung");

Das funktioniert dann auch, jedoch will ich nicht die ID einfach in einer Messagebox ausgeben sondern noch einiges mehr.
Mit der ID sollen dann noch anderen Methoden anderer Klassen und auch Methoden vom Webservice Aufgerufen werden.

Danke
CyberHunter

297 Beiträge seit 2008
vor 13 Jahren

Wire wäre es, wenn du dir die Ergebnisse der Webservice-Aufrufe einfach in Variablen merkst und sobald alle benötigten Aufrufe fertig sind, gibst du diese alle aus?
Die von dir genannte Methode wird nicht am erst am Ende ausgeführt, sondern wird schon vorher aufgerufen. Nach dem Aufruf, der ja asynchron ist, wie du schon gesagt hast, läuft die Methode weiter und führt die Schleife aus. Sobald eine Antwort des Webservice da ist, wird der Code in deiner anonymen Methode aufgerufen.

There are 10 kind of people, those who understand binary and those who don't.

849 Beiträge seit 2006
vor 13 Jahren

Hallo Cyberhunter,

ich denke ohne das Du uns sagst, was "einiges mehr" ist, können wir dir nicht weiter helfen. Silverlight ist ein wenig anders aufgebaut, gerade was WebServices angeht.
Wie du schon festgestellt hast sind alle Methodenaufrufe auf die Services async. Microsoft will damit verhindern das die Gui während des aufrufs blockiert. Das ist ein guter Gedanke, denn ein User will keine Blockierenden Oberflächen. Leider ist dann ein wenig umdenken, was die Aufrufe dieser Services angeht, angesagt.
Um die Methoden sync aufzurufen musst du immer den generierten Code umschreiben oder nen Wrapper schreiben -> kein gute Idee.

C
CyberHunter Themenstarter:in
131 Beiträge seit 2007
vor 13 Jahren

Danke für eure Antworten,
Ich habs mittlerweile zum laufen gebracht.
Finde nur das nun der Code sehr unübersichtlich und schwer zu lesen ist.
Das ganze sieht nun in etwa so aus:



_webservice.MethodeACompleted += (object s, eventargs e) =>
{
     //
     // ca. 100 Zeilen Code
    //
_webservice.MethodeBCompleted += (object s, eventargs e) =>
{
     //
     // ca. 100 Zeilen Code
    //
_webservice.MethodeCCompleted += (object s, eventargs e) =>
{
  //
  // ca. 100 Zeilen Code
  //
};
_webservice.MetdhodeCAsync();

};
_webservice.MethodeBAsync();

};
_webservice.MethodeAAsync();


Das ganze könnte ich nun bis zur MethodeK weiterführen.
So funktionierts nun, aber ich finde das sehr unübersichtlich und nicht ganz einfach zu lesen.

Danke
CyberHunter

297 Beiträge seit 2008
vor 13 Jahren

Dann verwende keine anonymen Methoden, sondern lager diese in reale Methoden aus. Das macht das Ganze wesentlich besser les- und wartbar.
Noch eine Sache, warum die Aufrufe asynchron sind: Bei manchen Browsern kann es passieren, dass die komplette Oberfläche einfriert, falls ein einzelner Tab blockiert. Das ist natürlich alles andere als gut, deshalb wurden alle Aufrufe asynchron gemacht.

There are 10 kind of people, those who understand binary and those who don't.