Princip för async/trådning
Jag har ett program som fungerar ungefär så här:
<code>
Public WSVar As String
Sub Something1()
'Div kod här
UseWebservice()
'Div kod här som använder variabeln WSVar
End Sub
Sub SubSomething2()
UseWebservice()
'Annan kod här som använder variabeln WSVar
End Sub
Sub UseWebservice()
WSVar = Webservie.ABC() 'Kalla på funktionen ABC i Webservice och spara resultatet i WSVar
'Koden här är egentligen längre eftersom svaret från webservicen måste behandlas, men slutresultatet sparas i WSVar
End Sub
</code>
Det fungerar bra, förutom att hela programmet låser sig medans Webservice.ABC körs. Just den biten kan man lösa genom att lägga till en handler för ABCCompleted och låta servicen köras async, men det ställer till det med Something1 och Something2 eftersom båda har kod som ska köras efter att Webservice.ABC är klar.
Allt det här kan lösas genom att kopiera all Webservice-kod till både Something1 och Something2 och att ange egna handlers för dom, men den lösningen känns inte "rätt".
Går det att lösa på ett finare sätt? Vet inte om principen gick fram, fråga i så fall så ska jag försöka förklara bättre =)
/Thomas
Svara
Sv: Princip för async/trådning
<b>Allt det här kan lösas genom att kopiera all Webservice-kod till både Something1 och Something2</b>
Är inte säker på att jag har fårstått allt korrekt nu... Borde du inte kunna lägga koden du vill dubblera som en egen funktion som anropar från Something1 och Something2, då blir det inte dubblerat?
/Johan
Svara
Sv:Princip för async/trådning
Så är ju exemplet jag skrev, all kod finns i UseWebservice() och den körs från Something1 och Something2, men kör jag den async så kommer efterföljande kod i Something1 och Something2 att köras direkt innan webservicen är klar.
/Thomas
Svara
Sv: Princip för async/trådning
Har läst din fråga fler gånger nu och inser att jag missuppfattade det. Har tyvärr inget förslag på "perfekt" lösning. Såhär borde vara genomförbart:
Kör hela UseWebservice (eller bara webservice-anropet om du vill det) i en separat tråd. Låt sedan Something1 och Something2 köra runt i en loop med DoEvents medan de väntar på att UseWebservice blir klar. På så vis "dör" inte programmet under tiden och du kan fortsätta köra koden efteråt när tråden är klar.
/Johan
Svara
Sv:Princip för async/trådning
Kanske inte den bästa lösningen men den fungerade helt ok. Tack för det!
/Thomas
Svara
Sv: Princip för async/trådning
Jag skulle itne köra den första tråden i en loop. Känns så där bra... Däremot borde du kunna använda antingen ett AutoResetEvent- eller ManualResetEventobjekt. [url:http://msdn2.microsoft.com/en-us/library/system.threading.autoresetevent.aspx]
Det kan användas till precis du behöver. Dvs stanna tråden till något annat hänt.
Svara
Sv:Princip för async/trådning
Nu har jag gjort några tester med AutoResetEvent och det verkar som att programmet "låser sig" tills man kör WaitEvent.Set i den andra tråden.
Ska det vara så eller har jag gjort fel?
Min tidigare lösning låser i alla fall inte programmet under tiden.
/Thomas
Svara
Sv: Princip för async/trådning
juste det är sant. tänkte inte på det. Kan du inte köra webservice delarna asynchront bara. Alla webservice proxies man skapar i VS har ju en BeginXXX metod till vilken du kan skicka en callback delegate... Bara ett tips...
Svara
Sv:Princip för async/trådning
Eller i 2.0: de har events. Som jag för övrigt hatar, delegater är smidigare ;)
Svara
Sv:Princip för async/trådning
BeginXXX blev jag rekommenderad tidigare men jag kan inte hitta något sånt. Det enda flertrådiga för webservices som jag har sett är just XXXasync, och det är ju så jag kör nu.
Men oavsett lösning så blir väl mitt problem detsamma? Att jag vill att den tråden som kör igång webservicen ska fortsätta där den var efter att webservicen är klar och det ska den göra utan att låsa resten av programmet.
/Thomas
Svara