Avatar billede lau_r Nybegynder
26. maj 2003 - 15:13 Der er 6 kommentarer og
2 løsninger

Threads og progressbar

Jeg har programmeret et program der desværre tager 5-10 sek om at hente data gennem en webservice og vil derfor gerne have en Progressbar der giver brugeren lidt feedback. Problemet er at mit program "stopper op" mens det venter på webservicen. Kan jeg bruge en thread til at holde liv i Progressbar'en? og hvordan opretter jeg en sådan?
Avatar billede nielslbeck Nybegynder
26. maj 2003 - 16:26 #1
Er ikke helt med på hvad du vil... hvordan vil du vide hvor meget data du har fået tilbage fra webservicen? Du får jo bare alle data tilbage på en gang... så du kan ikke sige via en progressbar hvor mange procent du har fået tilbage. Du kunne selvfølgelig gøre ligesom IE og andre browsere og forsøge at fortælle hvor meget der er kommet tilbage af det samlede - men som i IE og andre browsere vil det nok aldrig komme til at virke perfekt :-(

Hvis du ved, at kaldet tager 5-10 sekunder, kan du selvfølgelig lave en timer, som hvert sekund (eller noget i den stil) tæller progressbaren op... men det virker heller ikke som nogen smart løsning :-(

For at undgå, at dit program stopper op når du kalder webservicen, kan du køre kaldet gennem en tråd. Det kan f.eks. gøres sådan:

using System.Threading;

...

Thread t = new Thread(new ThreadStart(KaldWebservice));
t.Start();

...

private void KaldWebservice() {
  // Kald din webservice her
}
Avatar billede lau_r Nybegynder
26. maj 2003 - 18:00 #2
Det virker, men i forbindelse med webservice kaldet opretter jeg en ny Form og når jeg kalder denne metode gennem KaldWebservice() lever den kun i 1 sek. Skyldes det at den nye thread lukker ned efter kaldet? Hvordan kan jeg undgå dette?
Avatar billede nielslbeck Nybegynder
26. maj 2003 - 18:11 #3
Det er nemlig korrekt... tråden er færdig, og det nye vindue lukkes... Er det i det nye vindue dataene fra webservicen skal bruges? For så burde det jo nok være det nye vindue, som oprettede en ny tråd og kaldte webservicen...
Avatar billede lau_r Nybegynder
26. maj 2003 - 18:16 #4
Problemet er bare at det også tager tid at åbne det nye vindue og jeg vil meget gerne give brugerne feedback med det samme. kan jeg ikke holde liv i tråden og dermed vinduet?
Avatar billede nielslbeck Nybegynder
26. maj 2003 - 18:19 #5
Tror det bliver lidt svært at holde vinduet i live :-(

Men du kunne jo også initalisere vinduet tidligere (Form1 f1 = new Form1();) og så bare kalde f1.Show() når det skal bruges... så tager det i hvert fald ikke lang tid at vise det...
Avatar billede lau_r Nybegynder
26. maj 2003 - 18:38 #6
hmmm nu er mit problem at jeg kommer til at kalde show() før min tråd er færdig med at hente webservicen og dermed alle de data jeg skal bruge i show() kaldet. hjælp....
Avatar billede sneaky Nybegynder
28. maj 2003 - 09:38 #7
Der udbydes funktionalitet i webservice proxyen til at lave asynkrone kald, som præcis addresserer problematikken ved at hente data uden at "fryse" grænsefladen.

Istedet for at kalde webservicemetoden f.eks. webserviceInstans.GetData() skal du kalde følgende metode webserviceInstans.BeginGetData(), denne metode kører i sin egen tråd, og du kan angive hvilken metode den skal kalde når kaldet er færdigt (så du ikke selv aktivt skal spørge om kaldet er færdigt).

Url'en herunder indeholder al den information og kodeeksempler du behøver...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtskcallingwebserviceasynchronously.asp
Avatar billede lau_r Nybegynder
30. maj 2003 - 11:33 #8
Det asynkrone webservice kald er lige det jeg leder efter - tak!
Desværre kan jeg ikke få det til at virke... Er der nogen der kan finde fejl i følgende kode?
private void button1_Click(object sender, System.EventArgs e)
{
  localhost.Kommunikation kom=new localhost.Kommunikation();
  AsyncCallback async=new AsyncCallback(KaldWebservice);
  kom.BegingetDyr(104,async,kom);
  label2.Text="starter tråd!";
}

public void KaldWebservice(IAsyncResult ar)
{
  label2.Text="tråd færdig";
// Retrieve the original state for the proxy.
  localhost.Kommunikation kom= (localhost.Kommunikation)ar.AsyncState;
// Retrieve results by calling the End method of the proxy class
  DataSet ds2 = kom.EndgetDyr(ar);   
}

Programmet fryser inden den når KaldWebservic(). Jeg ved at min webservice virker!
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