16. november 2004 - 03:24Der er
12 kommentarer og 1 løsning
Event processing under kald til Web Service
Jeg har en .NET WinForm App, som kalder en Web Service for at hente data. Mens data hentes vil jeg gerne vise brugeren en animeret gif for at forsøde ventetiden. Men ... animationen kører ikke mens kaldet til web servicen står på. Er der en måde at løse det på?
Du skal kigge på at kalde web-servicen asynkront. Metoder hertil bliver genereret i forbindelse med "bind" til web-servicen hvis du anvender Visual Studio.
Ud over selve den metode (MitKald), du kalder på WebServicen, ligger der også en BeginMitKald og EndMitKald.
Du skal kalde BeginMitKald i stedet for MitKald, og så skal du gemme det IAsyncResult, du får tilbage. Desuden skal du registrere en callback funktion til BeginMitKald. Det er den funktion, som får besked, når WebService-funktionen er færdig. I den rutine skal du så kalde EndMitKald med det IAsyncResult, du gemte fra kaldet til BeginMitKald.
Du laver en tråd som udfører en metode som kalder webservicen (kig på Thread og ThreadStart-klasserne). I sluttningen af denne funktion kalder du så Invoke på en metode i din form der opdaterer et eller andet i formen og stopper timeglasset.
Grunden til at du skal bruge invoke er at man ikke må kalde metoder direkte i tråden der kører GUI'en fra andre tråde.
Om det er pænenere en asynkrone kald kommer vist helt an på ens arkitektur
Tak, jeg kigger på det. Under alle omstændigheder er det nok "overkill" idet den eneste grund er at animere en progress bar. Jeg har ikke behov for flere processer eller asynkronitet til noget som helst andet.
eeh... jo.. du har netop brug for enten asynkrone kald eller en ekstra tråd hvis du vil have sådan et animeret timeglas til at fungere. Og hvorfor? jo, når du starter dit program kører det i en enkelt tråd, den såkaldte GUI-tråd. Og en tråd kan kun udføre EN, og kun EEEN ting af gangen. Så den kan ikke både hente ting fra din webservice og animere et timeglas på samme tid. Dit program hænger altså ved den linje hvor du laver kaldet til webservicen og kører først videre når kaldet er færdigt.
Jeg synes ikke at arbejdet står mål med udbyttet i forhold til den minimale funtkionalitet jeg får ud af at kalde asynkront. Indtil videre har jeg valgt at undvære animationen og istedet lavet en statisk "Vent ..." form.
Det er jo ikke en kæmpe opgave at lave dit web service kald om til at være asynkront:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click lblResultat.Text = "Henter....." Try Dim callBack As AsyncCallback Dim ar As IAsyncResult Dim ws As New dk.dotnetforum.www.postnummer
callBack = New AsyncCallback(AddressOf AsyncKald) ar = ws.BeginFindByAsync(tbPostNr.Text, tbSekunder.Text, callBack, ws) Catch ex As Exception lblResultat.Text = "Der er sket en fejl :(" End Try
End Sub
Private Sub AsyncKald(ByVal ar As IAsyncResult) Try Dim pb As dk.dotnetforum.www.PostnummerBy Dim ws As dk.dotnetforum.www.postnummer ws = ar.AsyncState pb = ws.EndFindByAsync(ar) lblResultat.Text = pb.ByNavn & " har postnr. " & pb.PostNummer Catch ex As Exception lblResultat.Text = "Der er sket en fejl :(" End Try End Sub
Det var jo den løsning, jeg kaste i luften til at starte med.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.