Avatar billede lasserasch Juniormester
24. marts 2007 - 13:25 Der er 3 kommentarer og
1 løsning

Arbejde med flere tråde. Hvordan gør man?

Hejsa.

Jeg har lige et lille spørgsmål.

I mit efterhånden lidt store program, er jeg stødt på en lille mur.

Dvs. jeg skal til at finde ud af hvordan man arbejder med flere threads. Mit program skal køre over nogle langsomme 1 Mbit internetforbindelser og hente data fra SQL server mv.

Programmet kører, men mine forms loades kun halvt og så fryser de fordi SQL forespørgelser mv tager for lang tid om at blive udført.

Derfor kunne jeg godt tænke mig at få lagt noget over i andre tråde.

Specielt på min splashscreen, hvor jeg fylder 2 store datasets med varenumre. Her henter jeg over 200.000 varenumre ind i disse datasets, hvilket gør at min hoved form ser lidt kikset ud indtil splash screen er lukket igen.

Men jeg synes det er lidt svært at finde hoved og hale i det her med threads.

Jeg er kommet så langt at jeg har fået opsat en background worker, lavet "do_work" event osv.

Men jeg kan ikke få den til at sætte datasets på tværs af threads.

Det er sådan at jeg på min "frmmain" har 2 datasets, som jeg gerne ville have fyldt med resultatet fra min SQL forespørgelse, som jeg nu forsøger at køre fra "frmsplashscreen". Altså fra en anden tråd.

Og det kan jeg ikke få lov til. "Handling på tværs af tråde ikke tilladt".

Findes der en, som kan give mig en "Threads for dummys" forklaring på hvordan jeg får mit tråde projekt her til at virke?

Evt. et simpelt og godt kommenteret eksempel.


Mvh.
Lasse
Avatar billede fufan Nybegynder
26. marts 2007 - 22:58 #2
Hejsa

Du bør bruge invoke:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
  Invoke(new MethodInvoker(DoWork));
}

private void DoWork()
{
  // Fyld dit dataset her
}


Hvis du vil sende parametre med:

private delegate void DoWorkCallBack(string text);

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
  DoWorkCallBack dwcb= new DoWorkCallBack(DoWork);
  string str = "Vare numre";
  Invoke(dwcb, new object[] { str });
}

private void DoWork(string text)
{
  // Fyld dit dataset her
}


Mvh.
Stefan
Avatar billede lasserasch Juniormester
02. oktober 2007 - 11:46 #3
fufan, smid et svar! Har fundet ud af det for lang tid siden, så denne må vist lukkes! Men dit eksempel er ikke helt dårligt, så smid et svar for points!

/Lasse
Avatar billede lasserasch Juniormester
25. oktober 2007 - 08:17 #4
Nå, åbenbart ikke noget svar fra fufan.

Så bliver denne altså lukket igen! Desværre...

/Lasse
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