Jag har ett program som fungerar ungefär så här: <b>Allt det här kan lösas genom att kopiera all Webservice-kod till både Something1 och Something2</b> 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. 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: Kanske inte den bästa lösningen men den fungerade helt ok. Tack för det! 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] 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. 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... Eller i 2.0: de har events. Som jag för övrigt hatar, delegater är smidigare ;) 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.Princip för async/trådning
<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 =)
/ThomasSv: Princip för async/trådning
Ä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?
/JohanSv:Princip för async/trådning
/ThomasSv: Princip för async/trådning
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.
/JohanSv:Princip för async/trådning
/ThomasSv: Princip för async/trådning
Det kan användas till precis du behöver. Dvs stanna tråden till något annat hänt. Sv:Princip för async/trådning
Ska det vara så eller har jag gjort fel?
Min tidigare lösning låser i alla fall inte programmet under tiden.
/ThomasSv: Princip för async/trådning
Sv:Princip för async/trådning
Sv:Princip för async/trådning
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