webForumDet fria alternativet

Asynkrona webservice anrop...

.NET

5 svar · 653 visningar · startad av Gladh

Medlem sedan maj 20012 812 inlägg
Frågan#1

Hej!

Jag har stött på ett litet problem som jag inte riktigt hittat någon lösning på.

Det jag vill är att anropa en webservices 3 gånger parallellt, jag gör detta med hjälp av metoden xxxAsync() och lyssnar sedan på eventet xxxCompleted. Detta fungerar bra och gör även att jag inte använder upp fler worker_threads utan använder mig av io_threads istället.

Mitt problem är nu att jag har en struktur som gör att jag vill kunna anropa dessa 3 webservices, vänta på svar från alla 3 och sedan returnera svaret från alla 3 samtidigt. Alltså så här:

min aspx-sida anropar en metod i processmanager och förväntar sig en List<Result> tillbaka, min metod i processmanager anropar webservicen 3 gånger asyncront och skall sedan vänta tills resultatet från webservicerna kommer tillbaka (givetviss till en annan metod, där denna metod stoppar in resultatet i en "public" List<Result> variable) när alla resultaten är klara så skall metoden i processmanagern lämna tillbaka listan med resultatet till min aspx-sida.

Jag har sett exempel där man använder sig av IAsyncResult för att lösa detta, men om man skapar en webservice inne i VS2005 till ett classlibrary så genereras inte Beginxxx och Endxxx metoderna utan endast xxxAsyn() så det kan jag inte använda mig av.

Någon som har ett förslag...

- M

Medlem sedan jan. 20012 204 inlägg
#2

Fått någon ordning på det?

Medlem sedan maj 20012 812 inlägg
#3

Nope men jag skickade ett mail Dino Esposito han har bland annant skrivit 'Programming Microsoft ASP.NET Application2.0 Advanded Topics' där han tar upp async webprogrammering. Får se om jag får något svar.

Just nu har jag kört fast rejält... :(

- M

Medlem sedan aug. 20003 575 inlägg
#4

Jag vet inte om detta är ett snyggt svar men jag tror att det kommer att fungera.

Du säger att du väntar efter events, varför inte ligga och vänta i en tråd på att alla tre events skall hända och sedan gå vidare.

Alltså när ett event kommer spara detta i en variabel som din väntande klass kan komma åt, när alla 3 har kommit fortsätter den från loopen som väntar.

Medlem sedan maj 20012 812 inlägg
#5

Du säger att du väntar efter events, varför inte ligga och vänta i en tråd på att alla tre events skall hända och sedan gå vidare

Jo det har jag testat, om jag gjorde en join eller la mig i en loop med Sleep() på min "main" tråd, så stannade websidan där, den kom fick aldrig tillbaka något svar från webservicerna... testade att dra igång en ny tråd som kallade de 3 webservicerna och det ser ut att fungera, problemet blir då att jag nu har bundit upp 2 worker_threads när mitt mål var att släppa tillbaka den första tråden till poolen så inga worker_threads skulle bindas när mina webservice anrop görs :(

Nu verkar det dock som jag kommit en liten bit på vägen, jag upptäckte att Beginxxx och Endxxx finns med som protected methods i den genererade proxyklassen till webservicen, så jag har skapat mig en partialklass som använder dessa två methoder för att få till det som jag vill, inte speciellt snyggt och inte direkt enkelt för en wevprogrammerare att använda, skall se om jag lyckas wrappa upp det på något snyggt sätt...

- M

Medlem sedan maj 20012 812 inlägg
#6

Så ja, nu är det löst, inte jättesnyggt, men det fungerar bra och det blir enkelt för webutvecklaren att kalla metoder i business som gör att man får asynkrona websidor, med alla de fördelar som det ger...

Använde mig av reflections för att köra igång BeginInvoke på min webservicemethod (BeginInvoke var ju protected så den kom jag inte åt från min kod) och nu fungerar det bra, det blir ju lite att skriva för backend programmeraren, men de personen har förhoppnings lite mer kunskap om detta än vad webprogrammeraren har...

- En glad Magnus

259 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)