Avatar billede baatmus Nybegynder
16. november 2004 - 03:24 Der 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å?
Avatar billede Slettet bruger
16. november 2004 - 08:13 #1
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.
Avatar billede bennytordrup Nybegynder
16. november 2004 - 08:37 #2
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.
Avatar billede burningice Nybegynder
16. november 2004 - 13:08 #3
enten det, eller simpelhen at lave kaldet til webservicen i en tråd for sig selv
Avatar billede baatmus Nybegynder
16. november 2004 - 13:12 #4
Cyberfessor!
Det lyder interessant. Kan du give lidt nærmere info?
Avatar billede burningice Nybegynder
16. november 2004 - 13:19 #5
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
Avatar billede baatmus Nybegynder
16. november 2004 - 13:33 #6
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.
Avatar billede burningice Nybegynder
16. november 2004 - 14:10 #7
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.
Avatar billede guidmaster Nybegynder
17. november 2004 - 23:46 #8
Tag evt. et kig på denne artikel som jeg har skrevet på http://www.dotnetforum.dk/artikler/Asynkrone-web-services.aspx
Avatar billede baatmus Nybegynder
18. november 2004 - 02:31 #9
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.
Avatar billede baatmus Nybegynder
18. november 2004 - 02:46 #10
Vil det være muligt at eksekvere formen med animationen i en anden thread som løsning?
Avatar billede burningice Nybegynder
18. november 2004 - 02:51 #11
joo.. men det er dårligt design... al GUI-relateret arbejde bør holdes i samme tråd, og gerne i den tråd programmet starter op i.

Er det stort problem at lade dit webservice-kald køre i en seperat tråd?
Avatar billede guidmaster Nybegynder
18. november 2004 - 19:55 #12
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
Avatar billede bennytordrup Nybegynder
19. november 2004 - 08:35 #13
Det var jo den løsning, jeg kaste i luften til at starte med.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester