Problém se webservisem   otázka

VB.NET, WCF/WS

Potřeboval bych, prosím, poradit co dělám špatně. Ve své VB.NET Windows Aplikaci volám webservice, který má výsledek vypsat do Labelu. Předtím než se dostane odpovědi od webservisu, tak do labelu vypíši text, ten se mi však nezobrazí a jakmile dojde v běhu programu na volání webservisu zobrazí se v labelu místo požadovaného textu Please wait for result, předchozí stav a navíc neúplný. Neví někdo proč dochází k tomuto chování?

labStatus.Text = "Please wait for result."

Dim sampleserv As New ServiceReference1.Service1SoapClient

resStart = sampleserv.StartDT(var1, var2, var3)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1. Pro bloky kódu používejte tlačítko "VB code", ať se obarví syntaxe.

2. Text se nezobrazí, protože volání webové služby chvíli trvá a vy jej provádíte z UI vlákna, tedy z vlákna které se stará o formulář. Dokud nedoběhne procedura Button1_Click nebo kde to spouštíte, nemůže se měnit stav okna ani komponenty v něm.

Řešením je volat službu asynchronně, např. zde:

http://stackoverflow.com/questions/46307...

Samotné čekání na odpověď se provádí v jiném vlákně a vlákno starající se o formulář není zaneprázdněno - aplikace tedy nebude ve stavu "neodpovídá" a komponenty nebudou dělat blbosti.

Obecně jakékoliv dlouhotrvající operace by se měla dělat v jiném vlákně.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Děkuji moc, zkusím to předělat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Omlouvám se, ale potřeboval bych asi ještě poradit. Volání servisu jsem snad předělal na asynchornní, ale stále mi při volání aplikace zamrzá.

Přepsáním do asynchronního jsem se inspiroval zde:

http://chanmingman.wordpress.com/2011/03...

...
Dim ares As String = ""
...
Private Sub StartDTCallback(ByVal sender As Object, ByVal e As ServiceReference1.StartDTCompletedEventArgs)
ares = e.Result
End Sub
...
Dim sampleserv As New ServiceReference1.Service1SoapClient
AddHandler sampleserv.StartDTCompleted, AddressOf StartDTCallback
sampleserv.StartDTAsync(var1, var2, var3, var4)
TextBox4.Text = ares
...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tohle už by mělo být správně, pokud to zamrzá, tak kvůli něčemu jinému.

Co přesně to dělá?

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Zatím se mi to chová stejně jako synchronní volání.

Před voláním servisu vypisuji do labelu text ale ten se nezobrazí a místo něj se během volání zobrazí předchozí a navíc neúplný.

Navíc se mi e

Private Sub StartDTCallback(ByVal sender As Object, ByVal e As ServiceReference1.StartDTCompletedEventArgs)
ares = e.Result.ToString
End Sub

nevrací výsledek. Funkce se ale na vzdáleném servisu proběhne úspěšně.

V ServiceReference jsem zatrhl Generate asynchronous operations. a VS se postará aby při volání Async metod to běželo v jiném vlákně?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

P.S. S hodnotu kterou mě vrací webservis ještě následně pracuji a až poté ji vypisuji, takže provádění dalšího programového kódu čeká na dokončení příjmu výsledku z webservisu. Ale jak mám aplikaci donutit aby mi mezitím do labelu vypsala Please wait...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback